XPath解析数据
提取页面中整片整片数据时使用,但是必须确定当前
元素内容与响应的数据一致时才用xpath
1.什么是xpath
xpath是一门在HTML\XML文档中查找信息的语言,可用来在HTML\XML文档中对元素和属性进行遍历。
2. XML(可扩展标记语言)
被设计为传输和存储数据,其焦点是数据的内容
3. xpath选择节点(标签)工具
- Chrome插件 XPath Helper
- Windows下开源的XPath表达式编辑工具:XML Quire(XML格式文件可用)
- Firefox插件 XPath Checker
4. xpath语法
'''
/ - 从根节点选取
// - 从匹配选择当前节点选择文档中任意位置的节点(不考虑它们的位置)
. - 选取当前节点
.. - 选取当前节点的父节点
@ - 选取属性/定位元素 # //ul[@id="detail-list"]
'''
# 学习重点:
# 1)获取文本
# 'a/text()' # 获取a下的文本
# 'a//text()' # 获取a下的所有标签的文本
# '//a[text()='下一页']' # 选择文本为下一页的a标签
# 2)‘@符号’
# 'xx/@href' # 获取标签对应的href地址
# '//ul[@id="detail-list"] ' # 获取属性值为特定值的标签
# 2)‘//’
# 'li//a' # 表示li下任何一个a标签
Chorme浏览器选择对应路径的节点时被选中节点有一个属性’class=xh-highlight’
5. xpath节点选择语法
1)选择特定节点
# '/a[1]' '/a[last()]' '/a[last()-1]' # 获取第一个a标签;最后一个a标签;倒数第二个a标签
# '/a[position()>4]' # 从第五个a标签开始选
2)选择未知节点
# 通配符
* 匹配任何元素节点
@* 匹配任何属性节点
node() 匹配任何类型的节点
//title | //price 匹配所有title或price元素
6. lxml库的使用
from lxml import etree
# lxml能够修正HTML代码,但是可能会改错。使用etree.tostring观察修改之后的html的样子,根据修改之后的html字符串写xpath
# lxml 能够接收bytes和str的字符串
text = '''<div><ul><li>xxxx</li></ul></div>'''
# 将字符串转化为element对象
html = etree.HTML(text)
# 查看element对象中包含的字符串
print(etree.tostring(html).decode())
# 获取class为item-1 li下的a的href
ret1 = html.xpath("//li[@class='item-1']/a/@href")
ret3 = html.xpath("//li[@class='item-1']")
for i in ret3:
item = {}
item['title'] = i.xpath("./a/text()")[0] if len(i.xpath("./a/text()"))>0 else None
item['href'] = i.xpath("./a/@href")[0] if len(i.xpath("./a/@href"))>0 else None
print(item)
"""
提取页面数据思路:
1)先分组,取到一个包含分组标签的列表
2)遍历,取其中每一组进行数据的提取不会造成数据对应的错乱
"""