【发布时间】:2013-10-06 00:08:01
【问题描述】:
我正在使用 Scrapy 解析 XML 文档,但遇到了 XPath 问题。
我的 XML 如下所示:
<sdn:screen>
<foaf:Image rdf:about="http://search.shinrokuden.irides.tohoku.ac.jp/shinrokuden/archive/screen/07f9d1a0-5ef4-11e2-91ca-000c2923bf22.jpg"/>
</sdn:screen>
我需要rdf:about= 之后的网址。我正在使用scrapy 的remove_namespaces() 功能,因此我不需要在我的XPath 中使用命名空间。我尝试了以下 XPath,但它们都返回 []:
xxs.select('//record/metadata/RDF/Resource/screen/Image/about').extract()
xxs.select('//record/metadata/RDF/Resource/screen/Image/@about').extract()
xxs.select('//record/metadata/RDF/Resource/screen/Image[@about]').extract()
xxs.select('//record/metadata/RDF/Resource/screen[@about]').extract()
xxs.select('//record/metadata/RDF/Resource/screen/@about').extract()
还有许多其他类似的变体。
我知道到'//record/metadata/RDF/Resource/screen/Image' 的路径是正确的,因为它会输出数据,但就像我说的,那些试图访问“rdf:about”部分的人都想出了[]。我真的不认为命名空间是一个问题,因为我删除了命名空间,但我可能又错了。
【问题讨论】:
-
这些命名空间是在哪里声明的?
-
你可能想摆脱
record/metadata/RDF/Resource这个业务,尽量简化问题集,也可以展示xxs的创建 -
在我看来
.remove_namespaces()不会删除元素属性的命名空间。self._root.iter(*)(github.com/scrapy/scrapy/blob/master/scrapy/selector/…) 仅迭代元素,而不迭代属性。我用itunes.apple.com/fr/rss/topaudiobooks/limit=10/xml 进行了测试,必须调用xxs.register_namespace("im", "http://itunes.apple.com/rss")才能访问xxs.select('//entry//@im:assetType') -
@TheCorinne,我打开了一个问题并在github.com/scrapy/scrapy/pull/416提出了修复建议
-
@pault。太感谢了!我知道这是一个超级延迟的反应,但你真的帮了我。也感谢你在 scrapy 上修复它 - 你太棒了!
标签: python xml xpath namespaces scrapy