2013-04-16 53 views
0

解析XML的Wordpress我有一个WordPress的博客,包括引号的XML文件:搜索标签,同时与引入nokogiri

<item> 
    <title>Brothers Karamazov</title> 
    <content:encoded><![CDATA["I think that if the Devil doesn't exist and, consequently, man has created him, he has created him in his own image and likeness."]]></content:encoded> 
    <category domain="post_tag" nicename="dostoyevsky"><![CDATA[Dostoyevsky]]></category> 
    <category domain="post_tag" nicename="humanity"><![CDATA[humanity]]></category> 
    <category domain="category" nicename="quotes"><![CDATA[quotes]]></category> 
    <category domain="post_tag" nicename="the-devil"><![CDATA[the Devil]]></category> 
</item> 

我试图提取的标题,作者,内容和标签的东西。这里是我到目前为止的代码:

require "rubygems" 
require "nokogiri" 

doc = Nokogiri::XML(File.open("/Users/charliekim/Downloads/quotesfromtheunderground.wordpress.2013-04-14.xml")) 

doc.css("item").each do |item| 
    title = item.at_css("title").text 
    tag  = item.at_xpath("category").text 
    content = item.at_xpath("content:encoded").text 

    #each post will later be pushed to an array, but I'm not worried about that yet, so for now.... 
    puts "#{title} #{tag}" 
end 

我努力让所有从各item标签。我收到类似Brothers Karamazov Dostoyevsky的回报。我不担心它是如何格式化的,因为它只是一个测试,看它是否正确地选择了东西。任何人都知道我可以如何去做这件事?

我也想制作大写=作者标签,​​所以如果你知道如何做,它也会有所帮助,尽管我还没有尝试过。


编辑:我改变了代码,以这样的:

doc.css("item").each do |item| 
    title = item.at_css("title").text 
    content = item.at_xpath("content:encoded").text 
    tag  = item.at_xpath("category").each do |category| 
     category 
    end 

    puts "#{title}: #{tag}" 
end 

返回:

Brothers Karamazov: [#<Nokogiri::XML::Attr:0x80878518 name="domain" value="post_tag">,  #<Nokogiri::XML::Attr:0x80878504 name="nicename" value="dostoyevsky">] 

和这似乎更容易管理一些。它把我的计划从一个大写的标签中拿走了,但是,这并不是什么大事。我怎么能拉第二个value

+0

你是从网站上下载还是只是解析文件? –

+0

哦,对,这是一个很好的观点。我正在解析一个静态文件,对不起! – dax

回答

2

您正在使用at_xpath并且当at_方法仅返回第一个结果时,期望它返回多个结果。

你想要的东西,如:

tags = item.xpath("category").map(&:text) 

它会返回一个数组。

作为识别作者,您可以使用正则表达式来选择以大写字母开头的项目:

author = tags.select{|w| w =~ /^[A-Z]/} 

这将选择的资本化标签。这使标签不受影响。如果你想,而不是给作者从标签分开,你可以使用partition

author, tags = item.xpath("category").map(&:text).partition{|w| w =~ /^[A-Z]/} 

注意,在上面的例子中,笔者是一个数组,将包含所有匹配的项目(即超过一个大写标签)。

+0

就像一个魅力工作,谢谢! – dax