如何解析存储在数组元素中的Nokogiri元素?

时间:2012-05-10 12:44:01

标签: ruby nokogiri

我抓取了一个页面,并将页面中的元素存储到一个数组中。

如果我检查第一个元素:

puts "The inspection of the first my_listing: "
puts my_listing.first.first.inspect

输出结果为:

The inspection of the first my_listing: 
#<Nokogiri::XML::Element:0x80c58764 name="p" children=[#<Nokogiri::XML::Text:0x80c584e4 " May  4 - ">, #<Nokogiri::XML::Element:0x80c58494 name="a" attributes=[#<Nokogiri::XML::Attr:0x80c58340 name="href" value="http://auburn.craigslist.org/web/2996976345.html">] children=[#<Nokogiri::XML::Text:0x80c57f08 "residual income No experience is needed!!!">]>, #<Nokogiri::XML::Text:0x80c57da0 " - ">, #<Nokogiri::XML::Element:0x80c57d50 name="font" attributes=[#<Nokogiri::XML::Attr:0x80c57bfc name="size" value="-1">] children=[#<Nokogiri::XML::Text:0x80c577c4 " (online)">]>, #<Nokogiri::XML::Text:0x80c5765c " ">, #<Nokogiri::XML::Element:0x80c5760c name="span" attributes=[#<Nokogiri::XML::Attr:0x80c574b8 name="class" value="p">] children=[#<Nokogiri::XML::Text:0x80c57080 " img">]>]>

如何访问每个元素?例如,如何访问此对象中的第一个Text元素,即'May 4 - '?

如果我这样做:

puts my_listing.first.first.text, 

我得到了这个输出:

May  4 - residual income No experience is needed!!! -  (online)  img

另外,如何访问href属性?

my_listing.first.first[:href]

哪个不起作用。

2 个答案:

答案 0 :(得分:2)

请注意,Nokogiri将所有内容视为节点 - 无论是文本,属性还是元素。您的文档有一个孩子:

irb(main):014:0> my_listing.children.size
=> 1
irb(main):015:0> puts my_listing.children
<p> May 4 - <a href="http://auburn.craigslist.org/web/2996976345.html">residual income No
experience is needed</a> - <font size="-1"> (online)</font> <span class="p">
img</span></p>
=> nil

顺便说一句,puts使用to_s方法,并且该方法汇集了所有孩子的文本 - 这就是为什么你看到的文本比你想要的多。

如果你更深入地看到那个单一元素的孩子,你有:

irb(main):017:0> my_listing.children.first.children.size
=> 6
irb(main):018:0> puts my_listing.children.first.children
 May 4 - 
<a href="http://auburn.craigslist.org/web/2996976345.html">residual income No
experience is needed</a>
 - 
<font size="-1"> (online)</font>

<span class="p"> img</span>
=> nil

为了得到你所问的内容,继续沿着层次结构前进:

irb(main):022:0> my_listing.children.first.children[0]
=> #<Nokogiri::XML::Text:0x..fd9d1210e " May 4 - ">
irb(main):023:0> my_listing.children.first.children[0].text
=> " May 4 - "
irb(main):024:0> my_listing.children.first.children[1]['href']
=> "http://auburn.craigslist.org/web/2996976345.html"

答案 1 :(得分:0)

如果我拉下网页并拥有一个元素,就像你一样:

p c
> => #<Nokogiri::XML::Element:0x3ff9d9c6b660 name="a" ...

你可以得到孩子们:

c2 = c.children

然后得到他们的文字:

c2.text # or
c2[0].text  =>   => "Watch video! "

href可以这样得到:

c["href"] # -> "http://example.com/video/"