python中xpath的使用

本文详细介绍了XPath在Python爬虫中的应用,包括XPath的基础语法、特殊用法及如何通过XPath精确提取网页内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

XPath在Python的爬虫学习中,起着举足轻重的地位,对比正则表达式 re两者可以完成同样的工作,实现的功能也差不多,但XPath明显比re具有优势,在网页分析上使re退居二线。

XPath介绍: 
是什么? 全称为XML Path Language 一种小型的查询语言 
说道XPath是门语言,不得不说它所具备的优点: 
1) 可在XML中查找信息 
2) 支持HTML的查找 
3) 通过元素和属性进行导航

python开发使用XPath条件: 
由于XPath属于lxml库模块,所以首先要安装库lxml,具体的安装过程可以查看博客,包括easy_install 和 pip 的安装方法。

XPath的简单调用方法:

from lxml import etree

selector=etree.HTML(源码) #将源码转化为能被XPath匹配的格式

selector.xpath(表达式) #返回为一列表

 

XPath的使用方法: 
首先讲一下XPath的基本语法知识: 
四种标签的使用方法 
1) // 双斜杠 定位根节点,会对全文进行扫描,在文档中选取所有符合条件的内容,以列表的形式返回。 
2) / 单斜杠 寻找当前标签路径的下一层路径标签或者对当前路标签内容进行操作 
3) /text() 获取当前路径下的文本内容 
4) /@xxxx 提取当前路径下标签的属性值 
5) | 可选符 使用|可选取若干个路径 如//p | //div 即在当前路径下选取所有符合条件的p标签和div标签。 
6) . 点 用来选取当前节点 
7) .. 双点 选取当前节点的父节点 

另外还有starts-with(@属性名称,属性字符相同部分),string(.)两种重要的特殊方法后面将重点讲。

# -*- coding: UTF-8 -*-



from lxml import etree

html="""
<!DOCTYPE html>
<html>
    <head lang="en">
        <title>测试</title>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    </head>
    <body>
        <div id="content">
            <ul id="ul">
                <li>NO.1</li>
                <li>NO.2</li>
                <li>NO.3</li>
            </ul>
            
            <ul id="ul2">
                <li>one</li>
                <li>two</li>
                </ul>
            </div>
            
            <div id="url">
                <a href="http:www.58.com" title="58">581</a>
                <a href="http:www.youkuaiyun.com" title="优快云">优快云1</a>
            </div>
        </div>
    </body>
</html>
"""

selector = etree.HTML(html)
#获取id="ul"的内容中li的内容
content = selector.xpath('//div[@id="content"]/ul[@id="ul"]/li/text()')   #xpath以列表的形式返回
for item in content:
    print(item)

#获取a标签中href的值  方法1
content = selector.xpath('//a/@href')
for item in content:
    print(item)

#获取a标签的title属性的值   方法2
content = selector.xpath('/html/body/div/a/@title')
for item in content:
    print(item)

#获取a标签的元素的值
content = selector.xpath('//a/text()')
for item in content:
    print(item)





介绍XPath的特殊用法: 
1) starts-with 解决标签属性值以相同字符串开头的情况

举例说明

from lxml import etree
html="""
    <body>
        <div id="aa">aa</div>
        <div id="ab">ab</div>
        <div id="ac">ac</div>
    </body>
    """
selector=etree.HTML(html)
content=selector.xpath('//div[starts-with(@id,"a")]/text()') #这里使用starts-with方法提取div的id标签属性值开头为a的div标签 for each in content: print each #输出结果为: aa ab ac

2) string(.) 标签套标签

html="""
    <div id="a">
    left
        <span id="b">
        right
            <ul>
            up
                <li>down</li>
            </ul>
        east
        </span>
        west
    </div>
"""
#下面是没有用string方法的输出
sel=etree.HTML(html)
con=sel.xpath('//div[@id="a"]/text()')
for i in con: print i #输出内容为left west data=sel.xpath('//div[@id="a"]')[0] info=data.xpath('string(.)') content=info.replace('\n','').replace(' ','') for i in content: print i #输出为 全部内容

XPath提供的几个特殊的方法: 
XPath中需要取的标签如果没有属性,可以使用text(),posision()来识别标签。

举两个简单的例子:

from lxml import etree
html="""
    <div>hello
        <p>H</p>
</div>
<div>hehe</div>
"""
sel=etree.HTML(html)
con=sel.xpath('//div[text()="hello"]/p/text()')
print con[0] #H

这里使用text()的方法来判别是哪个div标签

from lxml import etree
html="""
    <div>hello
        <p>H</p>
        <p>J</p>
        <p>I</p>
</div>
<div>hehe</div>
"""
sel=etree.HTML(html)
con=sel.xpath('//div[text()="hello"]/p[posision()=2]/text()')
print con[0] #J

另外,在XPath中可以使用多重过滤方法寻找标签,例如ul[3][@id=”a”] 这里使用【3】来寻找第三个ul标签 并且它的id属性值为a

获取XPath的方式有两种: 
1) 使用以上等等的方法通过观察找规律的方式来获取XPath 
2) 使用Chrome浏览器来获取 在网页中右击->选择审查元素(或者使用F12打开) 就可以在elements中查看网页的html标签了,找到你想要获取XPath的标签,右击->Copy XPath 就已经将XPath路径复制到了剪切板。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值