Python网页解析与提取-XPath篇
一:安装与使用
①安装
通过python的lxml库,利用XPath对HTML进行解析;
所以首先安装lxml,使用命令下载:
pip3 install lxml
国外的源访问很慢,可以用国内的源进行下载,这里以清华的源为例,命令如下:
// 最后面是下载库的名称
pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple lxml
②使用
安装成功后,就可以直接使用了。
我们要了解,我们使用XPath是为了干什么!为了更好的去获取元素节点的信息和节点的内容
举个离子:
# 获取百度网页信息,并展示链接
from lxml import etree
import requests
req = requests.get("http://www.baidu.com") #爬取到的网页信息
req.encoding = 'utf-8'
html = etree.HTML(req.text) #将爬取到的网页信息使用HTML类进行初始化,目的是为了构造一个XPath解析对象
result = html.xpath('//a/text()')
result2 = html.xpath('//a/@href')
flag = 0
print("=========================================")
while(flag < len(result)):
print(result[flag] +' '+ result2[flag])
flag += 1
print("=========================================")
req
为爬取到的网页信息
html
将爬取到的网页信息使用HTML类进行初始化,目的是为了构造一个XPath解析对象(你得解析为XPath能认识的信息吧)
然后使用xpath()
方法选择你想选择的节点,括号里是匹配规则
在这里'//a/text()'
简单解释一下
-
“//”
表示从全文中查找 -
//a
从全文中查找所有a
标签 -
“/”
表示从当前节点查找 -
//a/text()
从全文中查找所有a
标签中的文本
这样就能获取到所有a标签里的文本信息了
而//a/@href
,这里的@
表示属性选择
也就是说获取所有a
标签的href
信息
更多的选取方式:
表达式 | 描述 |
---|---|
nodename | 选取此节点的所有子节点。 |
/ | 从根节点选取(取子节点)。 |
// | 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置(取子孙节点)。 |
. | 选取当前节点。 |
.. | 选取当前节点的父节点。 |
@ | 选取属性。 |
这样我们就完成对一个网站的信息进行提取,使用XPath可以快速的选区元素节点获取需要的信息
二:更多选取方法
谓语(Predicates)
谓语用来查找某个特定的节点或者包含某个指定的值的节点。
谓语被嵌在方括号中。
在下面的表格中,我们列出了带有谓语的一些路径表达式,以及表达式的结果:
路径表达式 | 结果 |
---|---|
/bookstore/book[1] | 选取属于 bookstore 子元素的第一个 book 元素。 |
/bookstore/book[last()] | 选取属于 bookstore 子元素的最后一个 book 元素。 |
/bookstore/book[last()-1] | 选取属于 bookstore 子元素的倒数第二个 book 元素。 |
/bookstore/book[position()< 3 ] | 选取最前面的两个属于 bookstore 元素的子元素的 book 元素。 |
//title[@lang] | 选取所有拥有名为 lang 的属性的 title 元素。 |
//title[@lang=‘eng’] | 选取所有 title 元素,且这些元素拥有值为 eng 的 lang 属性。 |
/bookstore/book[price>35.00] | 选取 bookstore 元素的所有 book 元素,且其中的 price 元素的值须大于 35.00。 |
/bookstore/book[price>35.00]//title | 选取 bookstore 元素中的 book 元素的所有 title 元素,且其中的 price 元素的值须大于 35.00。 |
XPath 通配符可用来选取未知的 XML 元素。
通配符 | 描述 |
---|---|
* | 匹配任何元素节点。 |
@* | 匹配任何属性节点。 |
node() | 匹配任何类型的节点。 |
选取若干路径
通过在路径表达式中使用"|"运算符,您可以选取若干个路径。
在下面的表格中,我们列出了一些路径表达式,以及这些表达式的结果:
路径表达式 | 结果 |
---|---|
//book/title | //book/price | 选取 book 元素的所有 title 和 price 元素。 |
//title | //price | 选取文档中的所有 title 和 price 元素。 |
/bookstore/book/title | //price | 选取属于 bookstore 元素的 book 元素的所有 title 元素,以及文档中所有的 price 元素。 |
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 |
更多信息可参考:菜鸟编程-xpath教程
我的个人博客查看更多信息:Couno’Blog