使用 Xpath (HtmlXPathSelector) 获取父子文本

Posted

技术标签:

【中文标题】使用 Xpath (HtmlXPathSelector) 获取父子文本【英文标题】:Get both parent and child text with Xpath (HtmlXPathSelector) 【发布时间】:2012-12-27 06:30:18 【问题描述】:

我正在抓取一个网站,我需要从这个 html 文档中获取数值:

<td>
<span style=" color: red; font-weight: bold;"> 1.950</span>
</td>
<td> 3.400</td>

我需要同时提取 1.950 和 3.400,但是当一个值仅在 a 中,而另一个值也有跨度时,我不知道该怎么做。有没有一种通用的方法来获取路径的父级和子级?我正在使用scrapy 框架和HtmlXPathSelector。我可以将/td/text() 用于其中一个,将/td/span/text() 用于另一个,但我需要在一个查询中执行此操作。如何实现?

【问题讨论】:

【参考方案1】:

您可以尝试使用:/td//text() 选择作为td 后代的每个文本节点

【讨论】:

【参考方案2】:

我认为你有两种方法可以解决这个问题。

使用 Xpath

following-sibling::node()

另一个是迭代所有的tds(但这可能很讨厌)

我会给你一个 Xpath 的例子

span_text = hxs.select("/td/span/text()")
next = span_text.select('following-sibling::node()') #you should get 3.400 (or with this idea :P)

如果你有这个 xml:

<?xml version="1.0" encoding="UTF-8"?>

<root>
  <td> 
    <span style=" color: red; font-weight: bold;">1.950</span> 
  </td>
  <td>3.400</td>
</root>

然后你执行这个 xpath 表达式:

//td/following-sibling::node()

您将获得 3.400

this is a good place to test xpath

【讨论】:

【参考方案3】:

你可以试试这个

.select("string()").extract()

它将提取所有没有任何html标签的文本

【讨论】:

以上是关于使用 Xpath (HtmlXPathSelector) 获取父子文本的主要内容,如果未能解决你的问题,请参考以下文章

Xpath的使用

XML编程总结——使用XPath对象查询xml文档

Python爬虫 解析 xpath -- Xpath Helper插件的安装xpath的基本使用

selenium- Xpath的详细使用

Python解析库lxml与xpath用法总结

xpath的使用