网络爬虫 xpath表达式

本文介绍了XPath,一种在XML/HTML文档中查找信息的语言,常用于网络爬虫的数据提取。XPath提供了丰富的路径表达式和内建函数,能够方便地匹配和选择XML/HTML中的元素。Python的lxml库支持XPath,通过示例展示了如何利用XPath选取文档中的各种节点,包括元素、属性、文本等,并给出了具体的操作方法,如选取父节点、子节点、同代节点,以及通过谓语匹配特定条件的节点。
摘要由CSDN通过智能技术生成

在编写爬虫程序的过程中提取信息是非常重要的环节,但是有时使用正则表达式无法匹配到想要的信息,或者书写起来非常麻烦,此时就需要用另外一种数据解析方法,也就是本节要介绍的 Xpath 表达式。

Xpath表达式
XPath(全称:XML Path Language)即 XML 路径语言,它是一门在 XML 文档中查找信息的语言,最初被用来搜寻 XML 文档,同时它也适用于搜索 HTML 文档。因此,在爬虫过程中可以使用 XPath 来提取相应的数据。

提示:XML 是一种遵守 W3C 标椎的标记语言,类似于 HTML,但两者的设计目的是不同,XML 通常被用来传输和存储数据,而 HTML 常用来显示数据。

您可以将 Xpath 理解为在XML/HTML文档中检索、匹配元素节点的工具。

Xpath 使用路径表达式来选取XML/HTML文档中的节点或者节点集。Xpath 的功能十分强大,它除了提供了简洁的路径表达式外,还提供了100 多个内建函数,包括了处理字符串、数值、日期以及时间的函数。因此 Xpath 路径表达式几乎可以匹配所有的元素节点。

Python 第三方解析库 lxml 对 Xpath 路径表达式提供了良好的支持,能够解析 XML 与 HTML 文档。

Xpath节点 
XPath 提供了多种类型的节点,常用的节点有:元素、属性、文本、注释以及文档节点。如下所示:

 
<?xml version="1.0" encoding="utf-8"?>
<website>
 
<site>
<title lang="zh-CN">website name</title>
<name>编程帮</name>
<year>2010</year>
<address>www.biancheng.net</address>
</site>
 
</website>

 上面的 XML 文档中的节点例子:


<website></website> (文档节点)

<name></name> (元素节点)

lang="zh-CN" (属性节点)

节点关系
XML 文档的节点关系和 HTML 文档相似,同样有父、子、同代、先辈、后代节点。如下所示:

<?xml version="1.0" encoding="utf-8"?>
<website>
 
<site>
<title lang="zh-CN">website name</title>
<name>编程帮</name>
<year>2010</year>
<address>www.biancheng.net</address>
</site>
 
</website>

from lxml import etree
 
# 定义字符串变量
wb_data = """
    <div>
        <ul>
            <li class="item-0">1<a href="link1.html">first item</a></li>
            <li class="item-1">2<a href="link2.html">second item</a></li>
            <li class="item-inactive">3<a href="link3.html">third item</a></li>
            <li class="item-1">4<a href="link4.html">fourth item</a></li>
            <li class="item-0">5<a href="link5.html">fifth item</a></li>
        </ul>
    </div>
"""
# 解析字符串为html对象,自动补全html、body
html = etree.HTML(wb_data)
 
# 将字符串转换为html的对象
html = etree.HTML(wb_data)
# / 代表根节点
data1 = html.xpath('/html')
print(data1)
 
# 代表后面的节点可以在任意位置
data2 = html.xpath('//a')
for i in data2:
    if hasattr(i,'text'):
        print(i.text)
    else:
        print(i)
print('---------------------------------')
 
# 具体的路径
data3 = html.xpath('/html/body/div/ul/li')
for i in data3:
    print(i)
 
print('---------------------------------')
# .代表当前节点, ..代表父级节点
data4 = html.xpath('/html/body/div/ul')
for i in data4:
    a = i.xpath('./li/a')
    for j in a:
        print(j.text)
for i in data4:
    div = i.xpath('../../div')
    print(div)
 
print('---------------------------------')
# @选取属性
data5 = html.xpath('//li/@class')
print(data5)
data6 = html.xpath('//a/@href')
print(data6)
 
print('---------------------------------')
# 匹配谓语
data7 = html.xpath('//li[1]/a')
print(data7)
data8 = html.xpath('//li[last()]')
print(data8)
data9 = html.xpath('//a[@href="link3.html"]')
for i in data9:
    if hasattr(i,'text'):
        print(i.text)
 
print('---------------------------------')
# *未知节点
data10 = html.xpath('//*')
print(len(data10))
for i in data10:
    if hasattr(i,'text'):
        print(i.text)
 
print('---------------------------------')
 
data11 = html.xpath('//@*')
print(len(data11))
print(data11)
 
print('---------------------------------')
# | 匹配两个
data12 = html.xpath('//li | //a')
print(len(data12))
 
 
# 解析数据,a标签的文本
# 写法一:text属性
data12 = html.xpath('/html/body/div/ul/li/a')
for i in data12:
    print(i.text)
# 写法二: text()函数
data13 = html.xpath('//a/text()')
print(data13)
 
# 解析文件:html文件,但是自定义解析器,因为etree默认是xml解析器
# 自定义解析器
parser = etree.HTMLParser(encoding='utf-8')
# 解析html的文件为html对象
html2 = etree.parse('123.html',parser=parser)
# 将对象html2变为字符串,解码,打印输出
# html_data = etree.tostring(html2,pretty_print=True)
# res = html_data.decode('utf-8')
# print(res)
 
# 任意匹配
data14 = html2.xpath('//*')
for i in data14:
    if hasattr(i,'text'):
        print(i.text)
 
# 打印电影名字,[]表示带有title属性的div
data15 = html2.xpath('//div[@title]')
for i in data15:
    # .当前节点div寻找title属性值
    title = i.xpath('./@title')
    desc = i.xpath('./text()')
    print(title,"\t\t\t\t",desc)
上述示例分析后,会得到如下结果:

title name year address 都是 site 的子节点
site 是 title name year address  父节点
title name year address  属于同代节点
title 元素的先辈节点是 site website
website 的后代节点是 site title name year address
etree.HTML()
etree.HTML()可以用来解析字符串格式的HTML文档对象,将传进去的字符串转变成_Element对象。作为_Element对象,可以方便的使用getparent()、remove()、xpath()等方法。并且自动补全html代码方便更好操作和查找。
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值