为什么 xpath 不返回此 XML 节点



所以我有如下所示的代码:

content_url = 'http://auburn.craigslist.org/cpg/index.rss'
doc = Nokogiri::XML(open(content_url))
bq = doc.xpath('//item')

但它将bq返回为空。

我确定它有那个标签,这是该页面上的前几个标签:

<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://purl.org/rss/1.0/" xmlns:ev="http://purl.org/rss/1.0/modules/event/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:syn="http://purl.org/rss/1.0/modules/syndication/" xmlns:dcterms="http://purl.org/dc/terms/" xmlns:admin="http://webns.net/mvcb/">
<channel rdf:about="http://auburn.craigslist.org/cpg/index.rss">...</channel>
<item rdf:about="http://auburn.craigslist.org/cpg/3012277218.html">...</item>

思潮?

由于 item 不在默认命名空间中,因此您需要告诉 XPath 在哪个命名空间下查看。

首先,命名空间是 xmlns 属性的设置。对于Craigslist来说,它似乎是http://purl.org/rss/1.0/。因此,这就是您必须告诉 XPath 要使用的命名空间。

但是,在调用 XPath 时,我们必须指定要使用的额外命名空间。这样。

doc.xpath('//item', { 'rdf' => 'http://purl.org/rss/1.0/' })

但事实并非如此,我们需要告诉 XPath 该项位于 rdf 命名空间下。我们可以通过在标签名称前面加上命名空间来做到这一点。这样。

doc.xpath('//rdf:item', { 'rdf' => 'http://purl.org/rss/1.0/' })

它与命名空间有关。你可以做:

doc.remove_namespaces!

或者你可以只使用

doc.css('item')

相反

相关内容

  • 没有找到相关文章

最新更新