即XML路径语言(XML Path Language),是一种用来确定XML文档中某部分位置的语言,它基于XML的树状结构,提供在数据结构树中寻找节点的能力,也适用于HTML文档中;
表达式 | 描述 | 示例 |
---|---|---|
nodename | 选词当前节点下节点的所有子节点 | div |
/ | 若在最前,则表示从根节点开始选取,否则选择某节点下的某个节点 | /div |
// | 从全局节点中选取某一节点所在所有位置 | //div |
@ | 选取某一节点属性 | //div[@color] |
. | 选取当前节点 | ./div |
… | 选取当前节点的父节点 | …/div |
路径表达式 | 描述 |
---|---|
/markstore/mark[1] | 选取markstore下第一个元素 |
/markstore/mark[last()] | 选取markstore下倒数第二个mark元素 |
markstore/mark[position()<5] | 选取markstore下前四个子元素 |
//mark[@id] | 选取拥有id的mark元素 |
//mark[@id=‘k’] | 选取id属性为k的mark元素 |
通配符 | 描述 |
---|---|
* | 匹配任意节点 |
@* | 匹配节点中的任意属性 |
node() | 匹配任何类型的节点 |
使用如下命令安装即可,
pip install lxml
from lxml import etree
text = '''
<div>
<ul>
<li class="id-1"><a href="www.baidu.com">baidu</a></li>
<li class="id-2"><a href="www.google.com">Google</a></li>
<li class="id-3 id-4" name='item'><a href="www.taobao.com">Taobao</li>
</ul>
</div>
'''
# 解析字符串为html文档
html = etree.HTML(text)
# 字符串序列化为html文档,会自动修正HTML文本
result = etree.tostring(html, encoding='utf-8')
print(result.decode('utf-8'))
# 从文件读取
parser = etree.HTMLParser(encoding='utf-8')
html = etree.parse('csdn.html', parser=parser)
# 获取所有a标签的href属性
aList = html.xpath('//a/@href')
for a in aList:
print(a)
# 属性多值匹配
html = etree.HTML(text)
result = html.xpath('//li[contains(@class, "id-4")/href/text()]')
print(result)
# 多属性匹配
html = etree.HTML(text)
result = html.xpath('//li[contains(@class, "id-4") and @name="item"]/href/text()')
print(result)
# 按序选择
text = """
<div>
<ul>
<li class="item-0"><a href="link1.html">first item</a></li>
<li class="item-1"><a href="link2.html">second item</a></li>
<li class="item-inactive"><a href="link3.html">third item</a></li>
<li class="item-1"><a href="link4.html">fourth item</a></li>
<li class="item-0"><a href="links.html">fifth item</a></li>
</ul>
</div>
"""
html = etree.HTML(text)
# 注意,xpath匹配中序号是以1开头的,而不是以0开头的
result = html.xpath('//li[1]/a/text()')
print(result)
result = html.xpath('//li[last()]/a//text()')
print(result)
result = html.xpath('//li[last()-2]/a/text()')
print(result)
result = html.xpath('//li[position()<3]/a/text()')
print(result)
本文主要介绍了爬虫中数据解析时所需要的用的XPath和lxml库,介绍了它们的安装方式和简单的使用方式,如果你有更好的建议和想法,欢迎留言指正。