我希望使用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="Equals"]/text()").extract()
编辑如下 -
response.xpath("//*[@condition='Equals']/text()").extract()
这给了我所有的文字,不仅仅是md5,而是其他STIX信息,这些信息很接近但仍然无法正常工作。我不确定这是否与名字中的冒号有关。
我很感激任何建议,谢谢!
答案 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()