xpath提取多个标签下的text

本文介绍了一种使用XPath的string(.)方法从复杂HTML结构中提取完整文本的技巧,解决了传统XPath表达式无法同时获取标签间及子标签文本的问题。

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

在写爬虫的时候,经常会使用xpath进行数据的提取,对于如下的代码:

<div id="test1">大家好!</div>

 

使用xpath提取是非常方便的。假设网页的源代码在selector中:

data = selector.xpath('//div[@id="test1"]/text()').extract()[0]

 

就可以把“大家好!”提取到data变量中去。

然而如果遇到下面这段代码呢?

<div id="test2">美女,<font color=red>你的微信是多少?</font><div>

 

如果使用:

data = selector.xpath('//div[@id="test2"]/text()').extract()[0]

 

只能提取到“美女,”;

如果使用:

data = selector.xpath('//div[@id="test2"]/font/text()').extract()[0]

 

又只能提取到“你的微信是多少?”

可是我本意是想把“美女,你的微信是多少?”这一整个句子提取出来。

这还不是最糟糕的,还有第三段代码:

<div id="test3">我左青龙,<span id="tiger">右白虎,<ul>上朱雀,<li>下玄武。</li></ul>老牛在当中,</span>龙头在胸口。<div>

 

而且内部的标签还不固定,如果我有一百段这样类似的html代码,又如何使用xpath表达式,以最快最方便的方式提取出来?

我差一点就去用正则表达式替换了。还好我去Stack Overflow上面提了问。于是很快就有人给我解答了。

使用xpath的string(.)

以第三段代码为例:

data = selector.xpath('//div[@id="test3"]')
info = data.xpath('string(.)').extract()[0]

 

这样,就可以把“我左青龙,右白虎,上朱雀,下玄武。老牛在当中,龙头在胸口”整个句子提取出来,赋值给info变量。

 

 

http://www.tuicool.com/articles/iqQFBn

### 使用 XPath 提取 `div` 标签下 `br` 前后的内容 要通过 XPath 获取 `div` 标签下 `br` 标签前后的内容,可以利用 XPath 的 **轴(axis)** 功能来实现。具体来说,可以分别使用 `preceding-sibling::text()` 和 `following-sibling::text()` 来获取目标节点的兄弟文本节点。 #### 获取 `br` 标签之前的内容 对于位于某个 `div` 中的 `br` 标签,其之前的文本内容可以通过以下 XPath 表达式获得: ```xpath //div/br/preceding-sibling::text() ``` 这会返回该 `br` 标签之前的所有文本节点[^1]。 #### 获取 `br` 标签之后的内容 类似的,如果想获取 `br` 标签之后的文本内容,则可采用如下表达式: ```xpath //div/br/following-sibling::text() ``` 此语句能够匹配到紧跟在指定 `br` 后面的所有文本节点。 需要注意的是,在实际应用过程中可能还需要进一步筛选具体的上下文中所需的单个或多个特定位置上的文本片段。比如仅需第一个前置或者后续文字时可以在上述基础上加上索引限定条件如 `[1]`: ```xpath //div/br/preceding-sibling::text()[1] //div/br/following-sibling::text()[1] ``` 这些方法允许精确控制所选范围并满足不同场景下的需求[^3]。 另外得注意的一点是当处理HTML页面结构复杂度较高情况下, 可能存在嵌套层次较深或者其他干扰因素影响最终结果准确性因此建议结合实际情况调整策略同时验证输出是否符合预期效果[^2]. 以下是基于 Python Selenium 实现的一个简单例子展示如何操作以上提到的功能: ```python from selenium import webdriver driver = webdriver.Chrome() # 加载网页 url = 'your_target_url' driver.get(url) # 查找 br 标签前后的文本内容 before_text = driver.find_element_by_xpath("//div/br/preceding-sibling::text()").text after_text = driver.find_element_by_xpath("//div/br/following-sibling::text()").text print(f"Before BR Text: {before_text}") print(f"After BR Text: {after_text}") driver.quit() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值