1. xpath
1.1 xpath helper插件在谷歌浏览器安装
用以输入xpath语句对内容定位
1.2 xpath 节点
<book>
<title>Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
book为根节点
title为book的子节点
1.3 xpath 语法
符号 | 描述 |
---|---|
// | 任意位置 |
/ | 从根节点开始 |
. | 当前节点 |
. . | 上一节点 |
@ | 选取属性 |
text() | 选取文本 |
[ ] | 定位 |
| | 选取多个 |
- xml代码
<?xml version="1.0" encoding="ISO-8859-1"?>
<bookstore>
<book>
<title lang="eng">Harry Potter</title>
<price>29.99</price>
</book>
<book>
<title lang="eng">Learning XML</title>
<price>39.95</price>
<a href='http://www.baidu.com'> haha </a>
</book>
</bookstore>
示例 | 描述 |
---|---|
//price | 选出所有price 元素 |
//title/text() | 选择出所有的title 中文本 |
bookstore | 所有bookstore 的子节点 |
/bookstore | 选择根节点 |
//book[1] | 选取第一个book |
//book[last()-1] | 选取倒数第二个 |
//book[postion() < 3] | 前两个book |
//title[@lang] | title 中拥有lang 属性的 |
//title[@lang=‘eng’] | title 中拥有lang='eng' 属性的 |
//book[price>35]/title | price>35 的book 元素的title |
//title | //price | 同时选择title 和price 元素 |
//title/text() | 选取title 包含的文本Harry Potter Learning XML |
//a/@href | 选择a 元素的属性href 的内容http://www.baidu.com |
2. 对HTML文本进行xpath提取
2.1 转换HTML为element元素,便可调用xpath方法
from lxml import etree
data = etree.HTML(html)
data_list = data.xpath('字符串语法规则') # 提取数据
2.2 代码示例
from lxml import etree
text = '''
<div>
<ul>
<li class="item-1">
<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="link5.html">fifth item</a>
</ul>
</div>
'''
# 方法一: 分别提取对应输出,但是如果当缺少其中的href或text()时对应关系错位
html = etree.HTML(text)
href_list = html.xpath('//a/@href')
text_list = html.xpath('//a/text()')
for a, b in zip(text_list, href_list):
print(a,b)
# 方法二:但是如果当缺少其中的href或text()时对应关系错位
a = html.xpath('//a/@href | //a/text()')
print(a)
# 方法三:将同一元素放置一起,当缺少其中的href或text()时会报错
e = html.xpath('//a') # 提取a元素
for s in e:
print(s.xpath('./@href')[0], s.xpath('./text()')[0])