0

したがって、次のようなコードがあります。

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>

考え?

4

2 に答える 2

5

itemはデフォルトの名前空間にないため、どの名前空間の下で検索するかを XPath に指示する必要があります。

まず、名前空間はxmlns属性が設定されているものです。Craigslist の場合、http://purl.org/rss/1.0/. したがって、それは、使用したい XPath に伝える必要がある名前空間になります。

ただし、XPath を呼び出すときは、使用する追加の名前空間を指定する必要があります。そのようです。

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

それだけではありませんが、項目がrdfネームスペースの下にあることを XPath に伝える必要があります。これを行うには、タグ名の前に名前空間を付けます。そのようです。

doc.xpath('//rdf:item', { 'rdf' => 'http://purl.org/rss/1.0/' })
于 2012-06-04T02:49:02.087 に答える
3

名前空間と関係があります。あなたがすることができます:

doc.remove_namespaces!

または、単に使用できます

doc.css('item')

代わりは

于 2012-06-04T02:49:44.413 に答える