安装模块
lxml
pip install lxml
认识lxml
lxml是python的一个解析库,支持HTML和XML的解析,支持XPath解析方式,而且解析效率非常高。
XPath,全称XML Path Language,即XML路径语言,它是一门在XML文档中查找信息的语言,它最初是用来搜寻XML文档的,但是它同样适用于HTML文档的搜索。
XPath的选择功能十分强大,它提供了非常简明的路径选择表达式,另外,它还提供了超过100个内建函数,用于字符串、数值、时间的匹配以及节点、序列的处理等,几乎所有我们想要定位的节点,都可以用XPath来选择。
xpath表达式常用语法
/ | 从根节点选取(取子节点)。 |
// | 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置(取子孙节点)。 |
. | 选取当前节点。 |
.. | 选取当前节点的父节点。 |
@ | 选取属性。 |
xpath的使用方法(代码注释详细)
str_html='''
<ul class="subject-list">
<li class="subject-item1">
<p>item1</p>
<div class="pic">
<a class="nbg" href="https://book.test.com/item1" onclick="moreurl(this,{i:'0',query:'',subject_id:'35546622',from:'book_subject_search'})"></a>
</div>
</li>
<li class="subject-item2 item2">
<div class="pic">
<a class="nbg" href="https://book.test.com/item2" onclick="moreurl(this,{i:'1',query:'',subject_id:'35005103',from:'book_subject_search'})">
</a>
</div>
</li>
<li class="subject-item3" name='item3'>
<div class="pic">
<a class="nbg" href="https://book.test.com/item3" onclick="moreurl(this,{i:'2',query:'',subject_id:'26435630',from:'book_subject_search'})">
</a>
</div>
</li>
</ul>
'''
#修复html
#etree模块可以修复HTML文档,将缺少的部分补齐
from lxml import etree
text_html=etree.HTML(str_html)
results=etree.tostring(text_html)
print(results.decode('utf-8'))
#1 //与/的区别,//获取当前节点下的所有节点(子孙节点),/获取当前节点(子节点)
#//ul/a取得ul下直接子节点(子节点)a标签,//ul//a取得ul下所有节点(子孙节点)的a标签
result1=text_html.xpath('//ul/a')
print('1',result1)
result2=text_html.xpath('//ul//a')
print(result2)
print()
#2 在选取节点时,可使用@符号将属性过滤,test()文本获取
result3=text_html.xpath('//ul/li[@class="subject-item1"]/p/text()')
print('2',result3)
print()
#3 属性获取
#使用@属性名形式获取
result4=text_html.xpath('//ul/li[@class="subject-item1"]/div/a/@href')
print('3',result4)
print()
#4 属性多值匹配
#适用多个属性匹配过滤
result5=text_html.xpath('//ul/li[@class="subject-item3" and @name="item3"]/div/a/@href')
print('4',result5)
print()
#5 按序选择
result6=text_html.xpath('//ul/li[1]/div/a/@href')#获取第一个li标签
result7=text_html.xpath('//ul/li[last()-1]/div/a/@href')#获取倒数第二个标签,last代表最后一个节点,可进行加减运算
result8=text_html.xpath('//ul/li[position()<3]/div/a/@href')#获取位置小于3的标签
print('5',result6,'\n',result7,'\n',result8)
XPath 运算符
下面列出了可用在 XPath 表达式中的运算符:
运算符 | 描述 | 实例 | 返回值 |
---|---|---|---|
| | 计算两个节点集 | //book | //cd | 返回所有拥有 book 和 cd 元素的节点集 |
+ | 加法 | 6 + 4 | 10 |
- | 减法 | 6 - 4 | 2 |
* | 乘法 | 6 * 4 | 24 |
div | 除法 | 8 div 4 | 2 |
= | 等于 | price=9.80 | 如果 price 是 9.80,则返回 true。 如果 price 是 9.90,则返回 false。 |
!= | 不等于 | price!=9.80 | 如果 price 是 9.90,则返回 true。 如果 price 是 9.80,则返回 false。 |
< | 小于 | price<9.80 | 如果 price 是 9.00,则返回 true。 如果 price 是 9.90,则返回 false。 |
<= | 小于或等于 | price<=9.80 | 如果 price 是 9.00,则返回 true。 如果 price 是 9.90,则返回 false。 |
> | 大于 | price>9.80 | 如果 price 是 9.90,则返回 true。 如果 price 是 9.80,则返回 false。 |
>= | 大于或等于 | price>=9.80 | 如果 price 是 9.90,则返回 true。 如果 price 是 9.70,则返回 false。 |
or | 或 | price=9.80 or price=9.70 | 如果 price 是 9.80,则返回 true。 如果 price 是 9.50,则返回 false。 |
and | 与 | price>9.00 and price<9.90 | 如果 price 是 9.80,则返回 true。 如果 price 是 8.50,则返回 false。 |
mod | 计算除法的余数 | 5 mod 2 | 1 |