我在循环时使用 nokogiri 和我的对象图,如下所示:
#<Nokogiri::XML::Element:0x3fe7b34a49c8 name="dt" children=[#
<Nokogiri::XML::Element:0x3fe7b34a4720 name="a" attributes=[#
<Nokogiri::XML::Attr:0x3fe7b34a46bc name="href" value="http://www.example.com">, #
<Nokogiri::XML::Attr:0x3fe7b34a4694 name="add_date" value="1246334352997870">] children=[#
<Nokogiri::XML::Text:0x3fe7b34a39c4 "Example.com Website ">]>, #
<Nokogiri::XML::Text:0x3fe7b34a35f0 "n">,
我想将此信息加载到此类中:
class LinkInfo
attr_accessor :href, :add_date, :text
end
href = http://www.example.com
add_date = 1246334352997870
text = "example.com website"
有没有一种优雅的方法可以做到这一点,我目前正在循环遍历孩子,并使用 if 语句做一些事情,看看我是否在正确的标签名称等。
我知道在 ruby 中,您可以使用 contains?查看值是否在集合中,但我也想获取该值。
假设您的 HTML 与上一个问题相同:
<dl><p>
<dt><h3 ADD_DATE="120ssssss">label 1</H#>
</dl>
<dl><p>
<dt><a href="http://www.example.com" ADD_DATE="12312323">Text 1</A>
<dt><a href="http://www.example.com" ADD_DATE="12312323">Text 2</A>
<dt><a href="http://www.example.com" ADD_DATE="12312323">Text 3</A>
</dl>
<dl><p>
<dt><h3 ADD_DATE="120ssssss">label 2</H#>
</dl>
<dl><p>
<dt><a href="http://www.example.com" ADD_DATE="12312323">Text 1</A>
<dt><a href="http://www.example.com" ADD_DATE="12312323">Text 2</A>
<dt><a href="http://www.example.com" ADD_DATE="12312323">Text 3</A>
</dl>
然后你可以这样做:
doc = Nokogiri.HTML(html)
links = doc.css('dl dt a').map do |link|
li = LinkInfo.new
li.href = link['href']
li.add_date = link['ADD_DATE']
li.text = link.text
li
end