Python爬⾍之xpath的基本使⽤(解析HTML详细介绍)
⽂章导航
1.XPath介绍
XPath,全称 XML Path Language,即 XML 路径语⾔,它是⼀门在 XML ⽂档中查信息的语⾔。最初是⽤来搜寻 XML ⽂档的,但同样适⽤于 HTML ⽂档的搜索。所以在做爬⾍时完全可以使⽤ XPath 做相应的信息抽取。
2. XPath 概览
3. XPath 常⽤规则
具体匹配后⾯会详细的讲解。
4. 安装
1、python3环境下安装命令:pip install lxml
2.pycharm安装
5.实例学习
5.1.常⽤数据的导⼊
5.1.1打开html⽂件导⼊
from lxml import etree
html = etree.parse('./test.html', etree.HTMLParser())
result = string(html)
print(result.decode('utf-8'))
5.1.2通过字符串转换成html格式
⽤lxml解析html
利⽤etree.HTML解析字符串
将字符串解析从html格式的⽂件, 经过处理后,部分缺失的节点可以⾃动修复,并且还⾃动添加了 body、html 节点。Python源码:
# -*- coding: utf-8 -*-
# 作者: 废⼈⼀枚
# 出⾃: 北京
# 创建时间: 10:11
import os, traceback
from lxml import etree
text ='''
<p>
<ul>
<li class="item-0"><a href="s1.bdstatic/">item 0 </a></li>
<li class="item-1"><a href="s2.bdstatic/">item 1 </a></li>
<li class="item-2"><a href="s3.bdstatic/">item 2 </a></li>
<li class="item-3"><a href="s4.bdstatic/">item 3 </a></li>
<li class="item-4"><a href="s5.bdstatic/">item 4 </a></li>
<li class="item-5"><a href="s6.bdstatic/">item 5 </a></li>
</ul>
</p>
'''
# 利⽤ etree.HTML 把字符串解析成 HTML ⽂件
html = etree.HTML(text)
#decode() ⽅法将其转化为 str 类型
s = string(html).decode()
print(s)
输出为:
5.2 绝对路径查
获取某个标签的内容
注意,获取a标签的所有内容,a后⾯就不⽤再加正斜杠,否则报错。
html_data = html.xpath('/html/body/ul/li/a')
for i in html_data:
)
或者
html_data = html.xpath('/html/body/ul/li/a/text()')
for i in html_data:
)
打印指定路径下a标签的属性
这⾥可以通过遍历拿到某个属性的值,查标签的内容,通过@属性名获取
html = etree.HTML(text)
html_data = html.xpath('/html/body/ul/li/a/@href')
for i in html_data:
print(i)
获取指定标签对应属性值的内容
使⽤xpath拿到得都是⼀个个的ElementTree对象,如果需要查内容的话,还需要遍历拿到数据的列表。
查到绝对路径下a标签属性等于s4.bdstatic/的内容。
html = etree.HTML(text)
html_data = html.xpath('/html/body/ul/li/a[@href="s4.bdstatic/"]/text()')
for i in html_data:
print(i)
html href属性
5.3 相对路径查(常⽤)
查所有li标签下的a标签内容
html = etree.HTML(text)
html_data = html.xpath('//li/a/text()')
print(html_data)
查⼀下l相对路径下li标签下的a标签下的href属性的值,注意,a标签后⾯需要双//
html = etree.HTML(text)
html_data = html.xpath('//li/a//@href')
print(html_data)
查a标签下属性href值为s4.bdstatic/的内容
html = etree.HTML(text)
html_data = html.xpath('//li/a[@href="s4.bdstatic/"]/text()')
print(html_data)
5.4 ⼦节点
通过 / 或 // 即可查元素的⼦节点或⼦孙节点。
选择 li 节点的所有直接 a ⼦节点xpath为://li/a
5.5 ⽗节点
html_data = html.xpath('//a[@href="s6.bdstatic/"]/../@class')
print(html_data)
#输出为:['item-5']
5.6 属性匹配
匹配时可以⽤@符号进⾏属性过滤
例如匹配li下属性class为item-5的内容
//li[@class="item-5"]
5.7 ⽂本获取
有两种⽅法:⼀是获取⽂本所在节点后直接获取⽂本,⼆是使⽤ //。
第⼆种⽅法会获取到补全代码时换⾏产⽣的特殊字符,推荐使⽤第⼀种⽅法,可以保证获取的结果是整洁的。# 第⼀种
from lxml import etree
html_data = html.xpath('//li[@class="item-1"]/a/text()')
print(html_data)
# 第⼆种
html_data = html.xpath('//li[@class="item-1"]//text()')
print(html_data)
5.8 属性获取
@符号相当于过滤器,可以直接获取节点的属性值
result = html.xpath('//li/a/@href')
print(result)
# 运⾏结果:['s1.bdstatic/', 's2.bdstatic/', 's3.bdstatic/', 's4.bdstatic/', 's5.bdstatic/', 's6.bdst atic/']
5.9 属性多值匹配
某些节点的某个属性可能有多个值:
from lxml import etree
text ='''
<li class="zxc asd wer"><a href="s2.bdstatic/">1 item</a></li>
<li class="ddd asd eee"><a href="s3.bdstatic/">2 item</a></li>
'''
html = etree.HTML(text)
result = html.xpath('//li[contains(@class, "asd")]/a/text()')
print(result)
# 运⾏结果:['1 item', '2 item']
5.10 多属性匹配
当前节点有多个属性时,需要同时进⾏匹配:
from lxml import etree
text ='''
<li class="zxc asd wer" name="222"><a href="s2.bdstatic/">1 item</a></li>
<li class="ddd zxc eee" name="111"><a href="s3.bdstatic/">2 item</a></li>
'''
html = etree.HTML(text)
result = html.xpath('//li[contains(@class, "zxc") and @name="111"]/a/text()')
print(result)
# 运⾏结果:['2 item']
5.11 函数
查最后⼀个li标签⾥的a标签的href属性(last()函数)
html = etree.HTML(text)
html_data = html.xpath('//li[last()]/a/text()')
print(html_data)
查倒数第⼆个li标签⾥的a标签的href属性
html_data = html.xpath('//li[last()-1]/a/text()')
print(html_data)
打印
['item 4 ']
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论