Python3爬虫系列整理(四)lxml库
1 lxml
安装**:pip3 install lxml
lxml,使用的是xpath的语法
xpath 是一门在 XML 文档中查找信息的语言。(遵循xml,html的树形结构)
xpath 可用来在 XML,html 文档中对元素和属性进行遍历。
lxml是python的一个解析库,支持HTML和XML的解析,支持XPath解析方式,而且解析效率非常高
XPath,全称XML Path Language,即XML路径语言,它是一门在XML文档中查找信息的语言,它最初是用来搜寻XML文档的,但是它同样适用于HTML文档的搜索
XPath的选择功能十分强大,它提供了非常简明的路径选择表达式,另外,它还提供了超过100个内建函数,用于字符串、数值、时间的匹配以及节点、序列的处理等,几乎所有我们想要定位的节点,都可以用XPath来选择** 例子:/html/body/div[6]/ul /html/body/div[6]/ul/li[1]/a**
1.1 xpath语法
1.1.1、选取节点
XPath 使用路径表达式在 XML 文档中选取节点。节点是通过沿着路径或者 step 来选取的。
列出了最有用的路径表达式.
1.1.2、在下面的表格中,我们已列出了一些路径表达式以及表达式的结果:
1.1.3、选取未知节点(re)
1.1.4、选取若干路径
2.1、初步使用
text = ‘’’****
****
****
** <meta = charset=‘UTF-8’ >******
**
****
****
**
**
**
******
** Hello World******
**
******** ******
** ******
** ******
****
’’’****
首先我们使用 lxml 的 etree 库,然后利用 etree.HTML 初始化,然后我们将其打印出来。
其中,这里体现了 lxml 的一个非常实用的功能就是自动修正 html 代码,lxml 因为继承了 libxml2 的特性,具有自动修正 HTML 代码的功能。比如,你没有写html的闭合标签,lxml默认会给你添加。
#coding=utf-8****
from lxml import etree****
text = ‘’’****
****
****
** <meta = charset=‘UTF-8’ >******
**
****
****
**
**
**
******
** Hello World******
**
******** ******
** ******
** ******
****
’’’****
#初始化生成一个xpath解析对象****
html = etree.HTML(text)****
#将xpath对象解析输出代码****
result = etree.tostring(html,encoding=‘utf-8’)****
#查看代码****
print(result.decode())****
#查看xpath解析对象****
print(type(html))****
#查看result****
print(type(result))****
运行结果如下:
****
** **
** **
**
**
**
**
** Hello World**
**
**** **
** **
** **
<class ‘lxml.etree._Element’>
<class ‘bytes’>
解析:以上代码标红的地方,证明lxml就有自动修复功能。
2.2获取标签**
#coding = utf-8****
from lxml import etree****
text = ‘’’****
****
****
** <meta = charset=‘UTF-8’ >******
**
****
****
**
**
**
******
** Hello World******
**
******** ******
** ******
** ******
****
’’’****
#初始化生成一个xpath解析对象****
html = etree.HTML(text)****
result = html.xpath(’/html/body/div/div/p’)****
#查看内容也可以用这种result = html.xpath(’/html/body/div/div/p/text()’),然后print(result)****
for i in result:****
#查看内容****
** print(i.text)******
#查看标签****
** print(i.tag)******
#查看属性****
** print(i.attrib)******
result = html.xpath(’//p’)****
for i in result:****
** #查看内容******
** print(i.text)******
** #查看标签******
** print(i.tag)******
** #查看属性******
** print(i.attrib)******
#获取节点的属性****
result = html.xpath**("//p/@class")******
result = html.xpath**(’//div[@class = “nice”]/p’)******
for i in result:****
** print(i.text)******
** print(i.tag)******
** print(i.attrib)******
# | 分割来选取若干个路径****
**from ****lxml **import etree
text = ’’'
****
****
** <meta = charset=‘UTF-8’ >******
**
****
****
**
**
**
******
** Hello World******
**
********
******
** 风一般的男人******
**
******** ******
** ******
** ******
****
’’’****
#初始化生成xpath对象****
html = etree.HTML(text)****
result = html.xpath("//p[@class = ‘p’]|//p[@class=‘e’]")****
**for ****i **in result:
** print(i)******
** print(i.text)#取出内容**
** print(i.tag)#取出标签**
** print(i.attrib)#取出属性**