python爬虫之xpath解析附示例

xpath解析

xpath是在XML文档中搜索内容的一门语言,html是xml的一个子集

我们在使用xpath的过程中类似于对于文件目录的访问

<book>
    <id>1</id>
    <name>野花遍地⾹</name>
    <price>1.23</price>
    <author>
        <nick>周⼤强</nick>
        <nick>周芷若</nick>
    </author>
</book>

首选先了解几个概念,在这个例子中:

  1. book, id, name, price…都被称为节点.

  2. Id, name, price, author被称为book的⼦节点

  3. book被称为id, name, price, author的⽗节点

  4. id, name, price,author被称为兄弟节点

安装

了解完了之后我们就可以去安装了

pip install lxml

用法

  1. 将要解析的html内容构造出etree对象
  2. 使用etree对象的xpath()方法配合xpath表达式来完成对数据的提取
xml = """
<book>
    <id>1</id>
    <name>野花遍地⾹</name>
    <price>1.23</price>
    <nick>哈哈哈哈</nick>
    <author id="1">
        <nick id="2">周⼤强</nick>
        <nick id="3">周芷若</nick>
        <group>
        	<nick>hhh</nick>
        </group>
    </author>
</book>
"""

tree = etree.XML(xml) # 如果要处理html文本的话使用etree.HTML(html)
# 获取book的所有子节点
result = et.xpath("/book")

# 获取book的子节点nick
result = et.xpath("/book/nick")

# 获取book中所有nick节点
result = et.xpath("/book//nick")

# 获取book中指定级数下的nick节点,使用*占位表示通配符
result = et.xpath("/book/*/nick")

# 获取某个标签中的属性
result = tree.xpath("/book/author/@id")

# 获取某个标签中的文本
result = tree.xpath("/book/name/text()")

# 根据属性筛选
result = tree.xpath("/book/author/nick[@id='2']/text()")

示例

基本操作掌握之后可以通过这篇博客查看实际使用方法:python爬虫之使用xpath解析爬取猪八戒网数据

### Python 爬虫XPath 解析结果为空的原因及解决方案 在使用 Python 进行爬虫开发时,如果遇到 XPath 解析返回空列表的情况,可能是由以下几个原因引起的: #### 1. HTML 结构不匹配 HTML 页面的实际结构可能与预期不同。浏览器通常会对页面的 HTML 文本进行规范化处理,比如自动添加 `<tbody>` 标签[^4]。这种情况下,即使网页源码中不存在 `<tbody>`,但在浏览器开发者工具中查看时可能会显示该标签。 ##### **解决方案** - 检查实际抓取到的 HTML 数据是否包含目标节点。 - 如果发现存在额外的 `<tbody>` 节点,则需要调整 XPath 表达式以移除这些不必要的部分。 ```python from lxml import etree html_content = """ <table> <tr><td>Example</td></tr> </table> """ tree = etree.HTML(html_content) result = tree.xpath("//table/tbody/tr/td/text()") # 错误示例 print(result) # 输出 [] correct_result = tree.xpath("//table//tr/td/text()") # 正确示例 print(correct_result) # 输出 ['Example'] ``` --- #### 2. 使用绝对路径而非相对路径 当尝试对已经提取的部分 DOM 树再次应用 XPath 时,继续使用 `/` 开头的绝对路径会导致解析失败[^3]。这是因为绝对路径是从整个文档的根节点开始查找,而不是基于当前子树范围内的上下文。 ##### **解决方案** - 将绝对路径改为相对路径,即去掉开头的斜杠 `/` 或者替换为 `.` 来表示当前位置作为起点。 ```python sub_tree = tree.xpath("//div")[0] wrong_sub_result = sub_tree.xpath("/span/text()") # 错误示例 right_sub_result = sub_tree.xpath("./span/text()") # 正确示例 ``` --- #### 3. 特殊字符编码问题 某些网站中的特殊字符(如 Unicode 编码)可能导致解析器无法正确识别内容。这尤其发生在手动拼接字符串或者未设置合适的解码方式的情况下。 ##### **解决方案** - 明确指定请求头中的编码参数; - 利用第三方库 (例如 requests-html) 自动检测并转换响应体的内容类型; ```python import requests from lxml import html response = requests.get('http://example.com', headers={'Accept-Encoding': 'utf-8'}) parser = html.fromstring(response.content.decode('utf-8')) data = parser.xpath('//some_xpath_expression') ``` --- #### 4. 动态加载的数据缺失 现代 Web 应用程序广泛采用 JavaScript 技术动态渲染界面元素。因此通过简单的 HTTP 请求所获得静态资源里未必能捕捉到最终呈现给用户的全部信息。 ##### **解决方案** - 借助 Selenium WebDriver 或 Playwright 工具模拟真实浏览行为直至完成所有异步脚本执行后再抽取所需资料; ```python from selenium import webdriver driver = webdriver.Chrome() driver.get("https://dynamic-content.example") element = driver.find_element_by_xpath('//*[@id="js-rendered"]') # 示例 XPATH content = element.text.strip() driver.quit() ``` --- #### 总结 以上列举了几种常见导致 XPath 返回空白数组的情形及其对应的修正措施。具体操作需视项目需求灵活运用上述技巧组合解决问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Hydrion-Qlz

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

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

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

打赏作者

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

抵扣说明:

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

余额充值