- @[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. 导入re模块,用re.search()方法和re.findall()方法
- 针对文本的解析,有正则表达式
- 针对HTML/XML解析有XPath、Beautiful Soup、正则表达式
- 针对JSON的解析,有jsonpath
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)选取节点
a)Element类简介
- Element类:可以理解为XML的节点
- ElementTree类:可以理解为一个完整的XML文档树
- ElementPath类:可以理解为XPath,用于搜索和定位节点
Element类是XML处理的核心类,可以直观的理解为XML节点,大部分XML节点的处理都是围绕篇Element类进行的
所以,我们要创建一个节点对象
#导入模块etree from lxml import etree #1.创建节点 (element对象) root = etree.Element('root')
上述示例中,参数root表示节点的名称
关于Element类的相关 *** 作,主要可分为三部分,分别是节点 *** 作、节点属性的 *** 作、节点内文本的 *** 作
-
节点 *** 作;若要获取节点的名称,可以通过tag属性获取
print(root.tag) #root print(etree.tostring(root)) #b'
'(我感觉这是节点的显示吧。。) #该函数将元素序列化为XML树的编码字符串表示形式 -
节点属性的 *** 作:在创建节点的同时,可以为节点增加属性。节点中的属性是以键值对的形式进行存储的,类似于字典的存储方式。通过构造方法创建节点时,可以在该方法中以参数的形式设置属性,其中参数的名称表示属性的名称,参数的值表示为属性的值。
#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'
' -
节点内文本的 *** 作:一般情况下,可以通过text、tail属性或者xpath()方法来访问文本内容
#3.添加文本 root.text='hello,world!' print(etree.tostring(root)) #b'
hello,world! '
为了能够将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类。现提供以下三个常用的函数:
-
find()方法:返回匹配的第一个子元素
-
findall()方法:以列表的形式返回所有匹配的子元素
-
iterfind()方法:返回一个所有匹配元素的迭代器
#三。查找与搜索元素 root = etree.XML("3.lxml库的基本使用aTextbText ") #可以通过xpath()语法搜元素 print(root.xpath('//a')) #返回列表 print(root.xpath('//a')[0].text) #find()方法,返回匹配的第一个子元素 print(root.find('a')) #findall().以列表形式返回所有匹配的子节点 print(root.findall('./a')) #[, ] #aText # #[ , ]
这里有一个测试用例文件,hello.html
- first item
- second item
- third item
- fourth item
- fifth item
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)