xpath基本使用

本文详细介绍了XPath的基本使用方法,包括安装库、路径表达式、谓语应用、属性查询、模糊搜索和实例演示,帮助读者掌握在HTML解析中定位和提取数据的技巧。

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

1.安装库

pip install lxml==4.5.1

2.xpath基本使用

2.1 导入库

from lxml import etree
headers={
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.146 Safari/537.36'
}
url = ''
reponse=requests.get(url,headers=headers).text
html=etree.HTML(reponse)

2.2 不同数据解析

  • 解析本地文件
    html_tree = etree.parse('a.html')
    
  • 解析网络文件
    reponse=requests.get(url,headers=headers).text
    html=etree.HTML(reponse)
    

3.基本语法

3.1路径表达式

表达式描述
/从根节点选取。
//从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。
./当前节点再次进行xpath
@选取属性。

3.2谓语(Predicates)

  • 谓语用来查找某个特定的节点或者包含某个指定的值的节点。
  • 谓语被嵌在方括号中。
路径表达式结果
/ul/li[1]选取属于 ul子元素的第一个 li元素。
/ul/li[last()]选取属于 ul子元素的最后一个 li元素。
/ul/li[last()-1]选取属于 ul子元素的倒数第二个 li元素。
//ul/li[position()< 3]选取最前面的两个属于 ul元素的子元素的 li元素。
//a[@title]选取所有拥有名为 title的属性的 a元素。
//a[@title=‘xx’]选取所有 a元素,且这些元素拥有值为 xx的 title属性。
//a[@title>10] > < >= <= !=选取 a元素的所有 title元素,且其中的 title元素的值须大于 10。
/bookstore/book[price>35.00]/title选取 bookstore 元素中的 book 元素的所有 title 元素,且其中的 price 元素的值须大于 35.00。

3.3选取未知节点

通配符描述
*匹配任何元素节点。 一般用于浏览器copy xpath会出现
@*匹配任何属性节点。
node()匹配任何类型的节点。

3.4选取若干路径

路径表达式结果
//book/title | //book/price选取 book 元素的所有 title 和 price 元素。
//title | //price选取文档中的所有 title 和 price 元素。
/bookstore/book/title | //price选取属于 bookstore 元素的 book 元素的所有 title 元素,以及文档中所有的 price 元素。

4. 属性查询

  • 查找所有包含id属性的div节点

    //div[@id]
    
  • 查找所有id属性等于main的div标签

    //div[@id="main"]
    
  • 查找所有的class属性

    //@class
    
  • //@attrName

    //li[@name="data"]//text()  # 获取li标签name为data的里面的文本内容
    
  • 获取第几个标签 索引从1开始

    tree.xpath('//li[1]/a/text()')  # 获取第一个
    tree.xpath('//li[last()]/a/text()')  # 获取最后一个
    tree.xpath('//li[last()-1]/a/text()')  # 获取倒数第二个
    

5. 模糊搜索

  • 查询所有id属性中包含aa的div标签

    //div[contains(@id, "aa")]
    
  • 查询所有id属性中包以aa开头的div标签

    //div[starts-with(@id, "aa")]
    
  • 查询所有id属性中包以aa结尾的div标签

    //div[ends-with(@id, "aa")]
    

6. 内容查询

  • 查找所有div标签下的直接子节点h1的内容

    //div/h1/text()
    
  • 属性值获取

    //div/a/@href  #  获取a里面的href属性值
    
  • 获取所有

    //*  #获取所有
    //*[@class="xx"]  #获取所有class为xx的标签
    
  • 获取节点内容转换成字符串

    c = tree.xpath('//li/a')[0]
    result=etree.tostring(c, encoding='utf-8')
    print(result.decode('UTF-8'))
    

7. 实例

7.1 元素查找

7.1.1 根据id查找

lis=html.xpath('//*[@id="content"]')

7.1.2 获取元素文本

# xpath索引从1开始
li.xpath('./div/div[2]/div[1]/a/span[1]/text()') # 得到一个

7.1.3 根据class查找

li.xpath('.//div[@class="star"]')

7.1.4 查找图片属性

li.xpath('./a/img/@src')
li.xpath('./a/img/@alt')
  • 下载图片
    img_src=href_etree.xpath('//div[@class="ImageBody"]//img/@src')[0]
    title=img_src.split('/')[-1]
    img=requests.get(img_src,headers=headers)
    with open(title,'wb') as fp:
        fp.write(img.content)
    

7.1.5 查找下一个同级节点

li.xpath('./following-sibling::div[1]')

7.2 级别元素查找

7.2.1 根据内容定位父元素

li.xpath('.//div[@class="title text-dark-red"]/h2[text()="全文赏析"]/parent::div')

7.2.1 根据内容定位父元素在定位下一个同级节点

li.xpath('.//div[@class="title text-dark-red"]/h2[text()="全文赏析"]/parent::div/following-sibling::div[@class="shici-content check-more"]//text()')
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

荼靡~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值