python爬虫之数据解析

python爬虫之数据解析,第1张

python爬虫之数据解析 文章目录
    • @[toc]
  • 第五章 数据解析
    • 一、正则表达式
      • 1. 导入re模块,用re.search()方法和re.findall()方法
    • 二、XPath和lxml库
      • 1. XPath语法
        • a)选取节点
        • b)谓语
      • 2. lxml库概述(需要导入lxml.etree模块)
        • a)Element类简介
        • b)从字符串或文件中解析XML
        • c)ElementPath类简介
      • 3.lxml库的基本使用
    • 三、Beautiful Soup
      • 1. 导入bs4.beautifuSoup
      • 2. 测试用例(‘’‘三个点表示原样式写入)
      • 3. 构造beautifulSoup对象
      • 4. 三个获取(获取节点、获取文本字符串、获取注释)
      • 5. 通过 *** 作方法进行解读搜索
      • 6. 通过CSS选择器进行搜索
    • 四、JSONPath和json模块
      • 1. json模块基本运用
        • (1) loads() json字符串->python
        • (2) jumps() python->json字符串 !!注意:jumps()方法默认使用ascii码,禁用,使用utf-8编码
        • 这里有个小技巧,可以设置缩进,让json格式看起来更爽洁
        • 格式化输出,用indent参数设定缩进的空格数,可以设置为2,或者4
        • (3) dump() python->json文件对象
        • (4) load() json文件->python
      • 2. JSONPath简介
      • 3. JSONPath语法对比
第五章 数据解析
  1. 针对文本的解析,有正则表达式
  2. 针对HTML/XML解析有XPath、Beautiful Soup、正则表达式
  3. 针对JSON的解析,有jsonpath
一、正则表达式 1. 导入re模块,用re.search()方法和re.findall()方法

re.search(想找的内容,一个整体)这是找第一个,后面的找不到

import re
exam = 'pachong'
str = 'pachonghei pachong'
ret = re.search(exam,str)#从str里找exam,但是只能找到第一个,后一个找不到
print(ret)
#

re.findall(正则语句,查找的文件)返回所有的符合条件的

import re
s = 'waawfajwkfokawh34578fjahwfokfawf'
print(re.findall(r'(ok)',s))#从s中查找所有的ok字符串,中间用的是正则表达式
#['ok', 'ok']	返回的列表
print(len(re.findall(r'(ok)',s)))#查看有多少个ok
#2

从字符串中提取中文,当中文不连接时,返回的是两个元素的列表

import re
#从字符串中提取中文
text = 'hello,世界world'
#1. 通过正则表达式
result = re.findall(r'[u4e00-u9fa5]+',text)
print(result)
#['世界']

import ew
#从字符串中提取中文
text = 'hello,世wada界world'
#1. 通过正则表达式
result = re.findall(r'[u4e00-u9fa5]+',text)
print(result)
#['世', '界']
二、XPath和lxml库 1. XPath语法 a)选取节点 表达式说明nodename选取此节点的所有子节点/从根节点选取//从匹配选择的当前节点选取文档中的节点,而不用考虑它们的位置(重要).选取当前节点(类似于Linux)…选取当前节点的父节点@选取属性 b)谓语 表达式说明/bookstore/book[1]选取属于bookstore子元素的第一个book元素/bookstore/book[last()]选取属于bookstore子元素的最后一个book元素/bookstore/book[last()-1]选取属于bookstore子元素的倒数第二个book元素/bookstore/book[position()❤️]选取最前面的两个属于bookstore元素的子元素的book元素//title[@lang]选取所有的title元素,且这些元素的拥有名称为lang的属性//title[@lang=‘eng’]选取所有的title元素,且这些元素的拥有值为eng的lang属性/bookstore/book[price>35.00]选取bookstore元素的所有book元素,且其中的price元素的值大于35.00/bookstore/book[price>35.00]/title选取bookstore元素中book元素的所有title元素,且其中的price元素值必须大于35.00 2. lxml库概述(需要导入lxml.etree模块)
  1. Element类:可以理解为XML的节点
  2. ElementTree类:可以理解为一个完整的XML文档树
  3. ElementPath类:可以理解为XPath,用于搜索和定位节点
a)Element类简介

Element类是XML处理的核心类,可以直观的理解为XML节点,大部分XML节点的处理都是围绕篇Element类进行的

所以,我们要创建一个节点对象

#导入模块etree
from lxml import etree
#1.创建节点 (element对象)
root = etree.Element('root')

​ 上述示例中,参数root表示节点的名称

​ 关于Element类的相关 *** 作,主要可分为三部分,分别是节点 *** 作、节点属性的 *** 作、节点内文本的 *** 作

  1. 节点 *** 作;若要获取节点的名称,可以通过tag属性获取

    print(root.tag)
    #root
    print(etree.tostring(root))
    #b''(我感觉这是节点的显示吧。。)
    #该函数将元素序列化为XML树的编码字符串表示形式
    
  2. 节点属性的 *** 作:在创建节点的同时,可以为节点增加属性。节点中的属性是以键值对的形式进行存储的,类似于字典的存储方式。通过构造方法创建节点时,可以在该方法中以参数的形式设置属性,其中参数的名称表示属性的名称,参数的值表示为属性的值。

    #2.给节点增加属性
    #在创建的同时添加属性
    root = etree.Element('root',name='zhang')
    print(etree.tostring(root))
    #b''
    

    还可以用set()方法,把属性键值对增加进已有的节点

    #2.2增加属性 set
    root.set('age','18')
    print(etree.tostring(root))
    #b''
    
  3. 节点内文本的 *** 作:一般情况下,可以通过text、tail属性或者xpath()方法来访问文本内容

    #3.添加文本
    root.text='hello,world!'
    print(etree.tostring(root))
    #b'hello,world!'
    
b)从字符串或文件中解析XML

为了能够将XML文件解析为树结构,etree模块中提供了如下3个函数

  1. fromstring()函数:从字符串中解析XML文档或片段,返回根节点
  2. XML()函数:从字符串常量中解析XML文档或片段,返回根节点
  3. HTML()函数:从字符串常量中解析HTML文档或片段,返回根节点

其中,XML函数的行为类似于fromstring函数;HTML()函数自动补全缺少的和标签

import lxml from etree
#二、解析xml
xml_data='data'
#方法1:用的是fromstring(),返回根节点
element= etree.fromstring(xml_data)
print(etree.tostring(element))
#b'data'
#方法2:用xml函数
element = etree.XML(xml_data)
print(etree.tostring(element))
#b'data'
#方法3:html函数,他会自动修正html
element = etree.HTML(xml_data)
print(etree.tostring(element))
#b'data'

从文件中读取

element = etree.parse('hello.html')#读取文件
c)ElementPath类简介

​ ElementTree类中附带了一个类似于XPath路径语言的ElementPath类。现提供以下三个常用的函数:

  1. find()方法:返回匹配的第一个子元素

  2. findall()方法:以列表的形式返回所有匹配的子元素

  3. iterfind()方法:返回一个所有匹配元素的迭代器

#三。查找与搜索元素
root = etree.XML("aTextbText")
#可以通过xpath()语法搜元素
print(root.xpath('//a')) #返回列表
print(root.xpath('//a')[0].text)
#find()方法,返回匹配的第一个子元素
print(root.find('a'))
#findall().以列表形式返回所有匹配的子节点
print(root.findall('./a'))

#[, ]
#aText
#
#[, ]
3.lxml库的基本使用

这里有一个测试用例文件,hello.html

 
  • first item
  • second item
  • third item
  • fourth item
  • fifth item

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5479997.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-12
下一篇 2022-12-12

发表评论

登录后才能评论

评论列表(0条)

保存