使用xpath和scrapy来浏览STIX文件?

时间:2016-08-01 00:36:42

标签: python xpath scrapy

我希望使用scrapy来浏览STIX文档,基本上将文档设置为RSS提要,然后“抓取”它。 目前,我只是使用ipython和scrapy shell来获取xpath。

<FileObj:Hashes>
    <cyboxCommon:Hash>
        <cyboxCommon:Type condition="Equals" xsi:type="cyboxVocabs:HashNameVocab-1.0">MD5</cyboxCommon:Type>
        <cyboxCommon:Simple_Hash_Value condition="Equals">C71F2F84500E6AE4485C967F72BB9E52</cyboxCommon:Simple_Hash_Value>
    </cyboxCommon:Hash>
</FileObj:Hashes>

我'scrapy'遭到攻击,我试图拔出md5哈希C71F2F84500E6AE4485C967F72BB9E52,页面上的所有MD5都是这样列出的。

这就是我所拥有的,但我无法让它发挥作用 -

response.xpath("//cyboxCommon:Simple_Hash_Value[@condition=&quotEquals&quot]/text()").extract()

编辑如下 -

response.xpath("//*[@condition='Equals']/text()").extract()

这给了我所有的文字,不仅仅是md5,而是其他STIX信息,这些信息很接近但仍然无法正常工作。我不确定这是否与名字中的冒号有关。

我很感激任何建议,谢谢!

2 个答案:

答案 0 :(得分:1)

在创建用于解析的树时,Scrapy Selector(或现在的Parsel Selector)会转义并清除标记等。

在您的情况下,您要查找的xpath是:

response.xpath("//simple_hash_value[@condition='Equals']/text()").extract()

您可以使用response.extract()查看已清理的树,以查看您的树现在的样子。

答案 1 :(得分:0)

好的,显然STIX有它自己的命名空间,这个特殊的问题使用了这个 -

xmlns:cybox =“http://cybox.mitre.org/cybox-2”

为了从STIX文件中获取文本,我必须使用name(),或者你可以使用local-name()

response.xpath("//*[name()='cyboxCommon:Simple_Hash_Value']/text()").extract()

response.xpath("//*/*[local-name()='Simple_Hash_Value']/text()").extract()

但是@granitosaurus如果我想要一个复合语句怎么办? MD5然后呢?我不能让这个工作......让我知道你是否需要我开一个新问题。

response.xpath("//*[name()='cyboxCommon:Type']/[text()='MD5']/following-sibling::[name()='cyboxCommon:Simple_Hash_Value']/text()").extract()