首页 > 解决方案 > 如何在绝对 xpath 中捕获特定节点的索引号

问题描述

解释背景故事有点复杂 - 但有必要 - 所以需要一些耐心。

我正在尝试解析 SEC Edgar 文件(此表格 10-K,作为一个随机示例),不是针对其财务数据,而是针对文档末尾表格中包含的展品列表。每个文档在该表中都有我感兴趣的 3 个属性(展览编号、标题和 URL),但对于这个示例,我将只关注 URL。

开始查找文档中的所有 URL 很容易:

from lxml import etree
import lxml.html

for element in tree.iter('a'):
   target = element.values()[0]

但是由于该文档可能包含数百个 URL,其中大多数是无关紧要的,因此我必须过滤结果以查找Archives在所有 Edgar URL 中无一例外地出现的单词。所以在下一阶段,我得到了他们每个人的 xpath:

if target is not None and 'Archives' in target:      
               print(tree.getpath(element))

到目前为止一切都很好,但这就是我卡住的地方:事实证明,由于某些非常奇怪的原因,每个相关的 URL 都不是出现在一个而是两个(在某些文档中 - 最多四个!)表中,并且这些不幸的是,表格不是文档中的第一个或最后一个表格,而是随机卡在中间的某个地方。因此,例如,Exhibit 10-5 的 xpath 是:

/html/body/document/type/sequence/filename/text/div[2]/table[9]/tr[17]/td[3]/p/a

/html/body/document/type/sequence/filename/text/div[2]/table[12]/tr[17]/td[3]/p/a

所以 URL 在表 9 和表 12 中出现在完全相同的位置。显然,我不希望这个 URL 出现两次是我的最终 URL 列表,所以在我的最终搜索中我想运行

for i in tree.xpath('//table[XXX]//*/a'):
     print(i.values()[0])

在此示例中,XXX或者9或的位置在哪里。12

回到问题的标题 - 我如何提取表的索引号,以便我可以为我的tree.xpath()表达式选择更高(或更低)的索引号?或者,有没有办法停止getpath表 9 的搜索?

标签: xpathweb-scrapinglxmlxml.etreeedgar

解决方案


推荐阅读