赞
踩
pip install lxml
lxml是python的一个解析库,支持HTML和XML的解析,支持XPath解析方式,而且解析效率非常高。
XPath,全称XML Path Language,即XML路径语言,它是一门在XML文档中查找信息的语言,它最初是用来搜寻XML文档的,但是它同样适用于HTML文档的搜索。
XPath的选择功能十分强大,它提供了非常简明的路径选择表达式,另外,它还提供了超过100个内建函数,用于字符串、数值、时间的匹配以及节点、序列的处理等,几乎所有我们想要定位的节点,都可以用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 表达式中的运算符:
运算符 | 描述 | 实例 | 返回值 |
---|---|---|---|
| | 计算两个节点集 | //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 |
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。