如何使用XPATH表达式从特定表中获取行 - 我似乎抓住了文档中的所有行

时间:2013-11-23 03:03:36

标签: python xpath lxml

我已在文件中读取并使用

创建了一个树
my_tree = html.fromstring(html_string)

然后我将所有表格分开了

tables = my_tree.xpath('//table')

现在我一直在玩桌子我正在尝试开发一种方法来找到文档中与模型表最接近的匹配。我列出了我可以考虑的所有属性,并考虑尝试找到一种方法来实现对每个表中行数的考虑,以与我的测试表中的行数进行比较。

所以我做了

table_lens = [len(table.xpath('//tr')) for table in tables]

有趣的是,table_lens列表中的所有值都是相同的。

我认为该值是文档中tr的总数(看起来大致正确)

我希望有一个与每个表中的行数对应的唯一值。

现在这很有趣,因为我也“看了”两个表的tr元素

for tr in tables[20].xpath('//tr'):
    tr

粗略检查显示tr元素转储每个引用相同的内存位置,然后我做了

tables[20].xpath('//tr') == tables[50].xpath('//tr')

并且翻译返回

True

所以这很吸引人 - 我以为我只会处理属于特定表的行,而是获取所有表中的所有行。

除此之外,我应该注意每个表[index]的表[index] .text_content()是唯一的。

为了确认表中的每个表都是唯一的,我也做了

>>> tables[20]
<Element table at 0x3260e60>
>>> tables[50]
<Element table at 0x3273570>
>>> 

Abarnert在下面的评论表明该行为是由于该文件的某些原因。有趣的可能性,但在评论发布后,我做了第二个文件,得到了相同的结果。但这是一个示例htm文件

http://www.sec.gov/Archives/edgar/data/22252/000119312512253074/d360877ddef14a.htm

在第二个例子中,有33个唯一的表,每个表有173 tr

1 个答案:

答案 0 :(得分:1)

在XPath中,//tr是绝对路径 - 来自文档顶部的所有tr节点。 tr是当前节点下的相对路径 - 所有tr节点。这就像在文件名中使用/foo而不是foo一样。

所以,就这样做:

table_lens = [len(table.xpath('tr')) for table in tables]

你会得到各种不同的数字,从1到14(或者更多,我没有查看整个列表)。