我正在尝试用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的文本而不是表格中任何更深层的内容?
答案 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
。