所以我的代码看起来像这样:
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>
思想?
答案 0 :(得分:5)
由于 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/' })
答案 1 :(得分:3)
它与名称空间有关。你可以这样做:
doc.remove_namespaces!
或者您可以使用
doc.css('item')
代替