【问题标题】:Scrapy grabbing elements too deep in tableScrapy 抓取表格中的元素太深
【发布时间】:2014-05-04 05:34:17
【问题描述】:

我正在尝试使用 Scrapy 抓取表格,但遇到了一个问题,即由于表格的结构,我获得了太多的子节点。

例如,表后面的td中有一个表,有点像这样:

<table>
    <tr>
        <td>
             Text I want
        </td>
        <td>
            <table>
                <tr>
                    <td>
                       Text I do not want
                    </td>
                </tr>
        </td>
</table>

所以当我告诉它抓取时:

td[1]/text()

它抓取每个 tr 的第一个 td 中的文本——这正是我想要的——但有些 td 有自己的表格!不要问我为什么他们以这种方式构建这个东西,或者为什么实际上没有比表级别本身更深的类或 id,但事实就是如此。因此,我还将返回表格内第一个 td 中的文本……那是我不想要的(还)在后面的 td 中。

如果没有 id 或类,我如何才能更具体地了解只需要第一个 td 的文本而不需要表中更深的任何内容?

【问题讨论】:

    标签: python xpath web-scraping html-table scrapy


    【解决方案1】:

    有几个选项可以继续:

    • 使用到顶层td的相对xpath(没有绝对的//会导致递归搜索):

      /path_to_table/table/tr/td[1]/text()
      
    • 检查td 在其祖先中只有一个table

      //td[count(ancestor::table) = 1]/text()
      

    希望对您有所帮助。

    【讨论】:

      【解决方案2】:

      我猜这是因为您在查询中的某处有这个:

      table//td[1]/text()
      

      //td 表示在任何级别的孩子中查找所有td

      改成:

      table/tr/td[1]/text()
      

      或者如果你有tbody

      table/tbody/tr/td[1]/text()
      

      这将获得tds,它们是您的table 的直接子代。

      【讨论】:

        猜你喜欢
        • 2019-06-18
        • 2018-12-27
        • 1970-01-01
        • 2021-01-20
        • 2015-01-16
        • 1970-01-01
        • 2021-12-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多