解释背景故事有点复杂 - 但有必要 - 所以需要一些耐心。
我正在尝试解析 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 的搜索?