【问题标题】:Get both parent and child text with Xpath (HtmlXPathSelector)使用 Xpath (HtmlXPathSelector) 获取父子文本
【发布时间】:2025-12-30 04:40:15
【问题描述】:

我正在抓取一个网站,我需要从这个 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() 用于另一个,但我需要在一个查询中执行此操作。如何实现?

【问题讨论】:

    标签: python html xpath scrapy


    【解决方案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标签的文本

        【讨论】: