如何在绝对xpath中捕获特定节点的索引号

时间:2019-04-11 12:25:51

标签: xpath web-scraping lxml xml.etree edgar

解释背景故事有点复杂-但这是必要的-因此需要一些耐心。

我正在尝试分析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])

在此示例中,XXX912的地方。

回到问题的标题-如何提取表的索引号,以便可以为tree.xpath()表达式选择较高(或较低)的索引号?另外,有没有一种方法可以在表9中停止getpath搜索?

0 个答案:

没有答案