Scrapy抓住元素太深在桌子里

时间:2014-03-26 02:35:43

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

我正在尝试用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中的文本 - 这正是我想要的 - 但是有些tds有自己的表!不要问我为什么他们以这种方式构建这个东西,或者为什么没有一个类或id被发现比表级本身更深,但是它就是这样。所以我也在表格中的第一个td中返回文本...这是我不想要的后来的tds。

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

2 个答案:

答案 0 :(得分:2)

有几种方法可以继续:

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

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

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

希望有所帮助。

答案 1 :(得分:2)

我想这是因为你在查询的某个地方有这个:

table//td[1]/text()

//td表示在任何级别的儿童中找到所有td

将其更改为:

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

或者如果您有tbody

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

这将获得td的直接子女table