3.__使用xpath和wordcount代码

本文介绍了如何使用Python的requests和lxml库通过XPath解析HTML,从指定网页抓取文章标题,适合初学者了解网页抓取技术。

xpath的基本使用:

#前提: pip  install requests ;  pip  install  lxml 

# 先启动 service  mysql start  service  apache2  start  开启mysql和apache2服务
# 导入requests库 
import requests
# 根据 url获取到对象 
response = requests.get("https://www.cnblogs.com/lone5wolf/p/10905339.html")
# 导入 etree库  
from lxml import etree
concent  = response.text
# 使用etree.HTML对网页的文本进行解析
title = etree.HTML(concent)

# 使用xpath 解析获取到数据
element = title.xpath("/html/body/div[2]/div[1]/div[1]/h1/a")


print(element[0].text)

使用eclipse的wordcount

  1. 创建map/reduce的project项目
  2. 书写代码
<think>我们正在处理一个关于lxml库中XPath表达式导致Invalidpredicate错误的问题。根据引用[2],这个错误通常在使用find()或findall()方法时出现,因为这两个方法对XPath的支持有限。而lxml的xpath()方法则支持完整的XPath1.0标准。因此,解决方案是使用xpath()方法代替find()或findall()。此外,引用[4]中的代码示例也遇到了同样的错误,并通过调整XPath表达式解决了问题。我们需要检查XPath表达式的语法是否正确,特别是谓词(predicate)部分。常见的错误原因包括:1.在谓词中使用了不支持的语法。2.谓词中的表达式不正确,比如缺少括号或引号。3.使用xpath()方法不支持的函数(但xpath()方法支持XPath1.0,所以一般函数是支持的,但要注意写法)。因此,解决步骤包括:1.确保使用xpath()方法而不是find()或findall()。2.检查XPath表达式,特别是方括号内的谓词部分,确保语法正确。下面我们给出一个具体的解决方案。</think>### lxml.etree.XPathEvalError: Invalid predicate 解决方案 该错误表示 XPath 表达式的**谓词部分**(即方括号 `[...]` 内的筛选条件)存在语法问题。以下是系统化的解决步骤: #### 1. **检查谓词语法错误(最常见原因)** - **引号不匹配**:确保属性值使用成对引号 ```xpath //div[@class="content"] ✅ //div[@class=&#39;content"] ❌(混合引号) ``` - **缺少运算符**:属性比较需完整表达式 ```xpath //a[@href] ✅(存在性检查) //a[@href=&#39;#&#39;] ✅(值比较) //a[href] ❌(缺少@符号) ``` #### 2. **避免嵌套谓词(常见陷阱)** ```xpath //div[@class=&#39;title_detail&#39;/h3] ❌ 错误嵌套 //div[@class=&#39;title_detail&#39;]/h3 ✅ 正确层级 ``` #### 3. **使用完整 XPath 方法替代 find/findall** ```python # 错误:findall() 对复杂 XPath 支持有限 html.findall("//ul/li[@class=&#39;active&#39;]") # 正确:使用 xpath() 方法 html.xpath("//ul/li[@class=&#39;active&#39;]") ``` 引用[2]明确指出:lxml 的 `find/findall` 仅支持 XPath 子集,复杂表达式需用 `xpath()`[^2]。 #### 4. **转义特殊字符** 若属性值含特殊字符(如 `[ ]`),需用 `concat()` 函数: ```xpath //*[contains(@class, concat(&#39;btn&#39;, &#39;-primary&#39;))] ✅ ``` #### 5. **验证表达式工具** 使用在线 XPath 验证器(如 FreeFormatter.com)提前测试表达式。 #### 修复案例 原始错误表达式(引用[4]): ```python result = html.xpath("//ul[@class=&#39;nav navbar-nav navbar-right&#39;]/li/a/text()") ``` 若出现错误,检查: 1. 确认 `@class` 属性值实际存在 2. 简化表达式逐步测试: ```python # 分步验证 html.xpath("//ul") # 检查节点存在性 html.xpath("//ul[@class]") # 检查属性存在性 ``` > **关键建议**:当表达式复杂时,优先使用 `xpath()` 而非 `find/findall`,并确保谓词部分符合 XPath 1.0 标准[^2][^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值