lxml库
lxml库是一款 Python数据解析库(用作数据提取)。也就是将html 或 xml 数据进行解析。为后续的正则匹配奠定基础
1.lxml.etree
在lxml库中,出场率最高的就是 lxml.etree
,其次就是 Element
对象,在数据解析的时候,大量的代码就是基于 Element
对象的 API 进行解析的
在爬虫的过程中,通过 etree.HTML 直接将 字符串
实例化为 element
对象
2.子节点与子孙节点
etree.HTML
返回的是html,是一个 Element 对象,但是一个有索引,可以 print(etree1[1])
etree.HTML
包含了子节点,因此可以通过循环的方式,遍历所有的子节点。如果想继续遍历子节点的子节点,可以通过双重for循环的方式
遍历子节点
import requests
from lxml import etree
response = requests.get('http://www.jsons.cn/zt/')
response.encoding='utf-8'
html = response.text
etree1 = etree.HTML(html)
print(html)
print(etree1)
print(etree1.tag)
print(type(etree1))
print('-'*60)
输出所有的标签,并且返回字符串的形式
for child in etree1:
for sun in child:
#print(sun.tag) # 只输出标签值,例如meta、link等
print(etree.tostring(sun)) # 以字符串的形式输出 b'String'
3.XPath-数据提权(重点)
其中包含了很多的函数,从 etree.HTML 对象中 匹配出合适的内容
XPath 基本语法
表达式 | 描述 |
---|---|
nodename | 选取此节点的所有子节点 |
/ | 从根节点选取 |
// | 从任意位置匹配(不用写出完整的路径) |
. | 选取当前节点 |
… | 选取当前节点的父节点 |
@ | 选取属性 |
XPath 基本用法
-
可以直接使用 etree.tml.xpath(‘xpath表达式’) 获取网页的相关数据
-
通过etree.xpath获取 element对象(element对象是列表),然后利用其text属性获取对应的文本内容,注意element对象是文本的形式
eg: etree.xpath('body')[0][0].text
代码示例
注意 下面的的这行代码
print(etree1.xpath('//body/h2/text()'))
我们这样写
print(etree1.xpath('//body')[0][0].text)
,因为etree.xpath
是一个element(列表)的格式但是推荐前者,更容易上手,面对复杂的网页结构也能游刃有余。
import requests
from lxml import etree
#reponse = requests.get('http://www.jsons.cn/zt/')
reponse = requests.get('http://127.0.0.1/crawler/spider.html')
reponse.encoding='utf-8'
html = reponse.text
etree1=etree.HTML(html)
#print(html)
print(etree1)
print(etree1.xpath('//body/h2/text()')) #获取网页 指定标签的内容
print('-'*60)
print(etree1.xpath('string()')) #只获取标签值(也就是呈现在网页上的内容)
4.find函数
iterfind() 返回查到的数据,迭代器x形式返回
findall() 返回匹配到的列表
find() 返回第一个匹配到的数据
findtext() 返回匹配到的文本数据,第一个
代码演示
print(etree1[0].find('title').text)
print(etree1[1].findall('*')[0].text)
参考文章
lxml文章:https://dream.blog.csdn.net/article/details/119633672
XPath简单使用视频:https://www.zhihu.com/search?type=content&q=xpath%E4%BD%BF%E7%94%A8
XPath基础:https://www.w3school.com.cn/xpath/xpath_syntax.asp