解释背景故事有点复杂-但这是必要的-因此需要一些耐心。
我正在尝试分析SEC Edgar档案(this Form 10-K, as a random example),不是为了其财务数据,而是为了对文档末尾的表格中的展览清单进行解析。该表中的每个文档都具有我感兴趣的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不在一个表中出现,而是在两个表中(在某些文档中最多显示四个!)中出现。并且不幸的是,这些表不是文档中的第一个或最后一个表,而是随机地卡在中间的某个位置。因此,例如,展示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()
表达式选择较高(或较低)的索引号?另外,有没有一种方法可以在表9中停止getpath
搜索?