所以我有如下所示的代码:
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')
相反