Xpath 提取数据

XPath,全称是 XML Path Language,即 XML 路径语言,它是一门在 XML 文档中查找信息的语言。它最初是用来搜寻 XML 文档的,但是它同样适用于 HTML 文档的搜索。

表 达 式 描  述
nodename 选取此节点的所有子节点
/ 从当前节点选取直接子节点
// 从当前节点选取子孙节点
. 选取当前节点
.. 选取当前节点的父节点
@ 选取属性

//title[@lang='eng'] 这就是一个 XPath 规则,它代表选择所有名称为 title,同时属性 lang 的值为 eng 的节点。

  • bookstore:选取 bookstore 元素的所有子节点。
  • /bookstore: 选取根元素 bookstore。注释:假如路径起始于正斜杠( / ),则此路径始终代表到某元素的绝对路径!
  • bookstore/book: 选取属于 bookstore 的子元素的所有 book 元素。
  • //book: 选取所有 book 子元素,而不管它们在文档中的位置。
  • bookstore//book: 选择属于 bookstore 元素的后代的所有 book 元素,而不管它们位于 bookstore 之下的什么位置。
  • //@lang: 选取名为 lang 的所有属性
    在 XPath 中,contains( ) 是一个非常实用的字符串匹配函数,用于判断某个节点的文本或属性是否包含指定的子字符串,特别适合处理模糊匹配场景(如属性值含动态部分、多值属性等)

基础语法:contains(目标字符串, 待匹配的子字符串)
html = '<a href="/book/123" class="title">红楼梦</a>'

//a[@class="title"]/text() # 按class定位,提取文本
//a[contains(@href, "/book/")]/text() # 按href部分内容定位

image
一句话总结: / 是“直线路径”,// 是“地毯式搜索”。

通配符使用
XPath提供了多种通配符来简化表达式:

  1. *:匹配任何元素节点
    示例://*[@id='content'] 匹配任何id为content的元素
  2. @*:匹配任何属性节点
    示例://div[@*] 匹配所有带属性的div元素
  3. node( ):匹配任何类型的节点
    示例://div/node( ) 匹配div的所有子节点

xpath基本概念
xpath解析:最常用且最便捷高效的一种解析方式。通用性强。

xpath解析原理
1.实例化一个etree的对象,且需要将被解析的页面源码数据加载到该对象中
2.调用etree对象中的xpath方法结合xpath表达式实现标签的定位和内容的捕获。
○ 将本地的html文件中的源码数据加载到etree对象中:
etree.parse(filePath)
○ 可以将从互联网上获取的原码数据加载到该对象中:
etree.HTML('page_text')

案例:
image
image

# 需求:获取昆明8-15天天气预报
import requests
from lxml import etree
url = 'https://www.weather.com.cn/weather15d/101290101.shtml'
headers = {
    'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36'
}
response = requests.get(url,headers=headers)
response.encoding = 'utf-8'
# print(response.text)

# 解析html为元素树
tree = etree.HTML(response.text)
lis = tree.xpath('//div[@id="15d"]/ul/li')
for li in lis:
    date = li.xpath('./span[1]/text()')[0]
    weather = li.xpath('./span[2]/text()')[0]
    temperature_max = li.xpath('./span[3]/em/text()')[0]
    temperature_min = li.xpath('./span[3]//text()')[1]
    print(date,weather,temperature_max,temperature_min)

image

posted @ 2025-09-27 15:50  無心的Man  阅读(23)  评论(0)    收藏  举报