如何用Nokogori同时解析html文件中标签的属性和值?

时间:2016-11-06 05:32:42

标签: html ruby shell

假设我有一个名为MembershipTypeId的html文件,如下所示:

ex.html

我想逐行提取属性<ul> <li data-value="datav1">val1</li> <li data-value="datav2">val2</li> <li data-value="datav3">val3</li> </ul> 和文本值,并输出结果如下:

  

datav1:VAL1

     

datav2:val2的

     

datav3:VAL3

但是我是 Nokogori 的新手,我所知道的只是下面的代码,它只能提取属性data-value,而且我不知道如何提取属性和文本在同一个循环中的值。

data-value

我真的很感激,如果有人可以通过 Nokogori 教我如何使其工作,那么如果有任何其他解决方案可以简单地使用shell脚本会更好。

更新

感谢@Rajarshi Das和@Arun Kumar,你的答案部分解决了我的问题。现在的问题是require 'nokogiri' page_temp = Nokogiri::HTML(open("ex.html")) page_temp.xpath('//li/@data-value').each do |node| puts node end 是一些汉字。当我在终端打印出来时,它们无法识别。 我在执行node.text后尝试打印出page_temp,我发现所有中文字符都像page_temp = Nokogiri::HTML(open("ex.html"))。所以我想我在ruby中读错了&#128;文件。

3 个答案:

答案 0 :(得分:2)

你可以这样试试......

 page_temp.xpath('//li').each do |node|
  puts "#{node.attributes['data-value'].value}:#{node.children.first.content}"
end

并输出get

   datav1:val1
   datav2:val2
   datav3:val3

通过nokogiri你可以像第一步那样一步一步地完成

 page_temp.xpath('//li').each do |node|

只需拿一个项目

即可得到它的输出
 page_temp.xpath('//li').first
 #=> #<Nokogiri::XML::Element:0x1827ae0 name="li" attributes=[#<Nokogiri::XML::Attr:0x1827aa4 name="data-value" value="datav1">] children=[#<Nokogiri::XML::Text:0x182781c "val1">]>

现在你需要datav1:val1

所以datav1在属性

page_temp.xpath('//li').first.attributes
   => {"data-value"=>#<Nokogiri::XML::Attr:0x1827aa4 name="data-value" value="datav1">}

所以为了得到它你可以做page_temp.xpath('//li').first.attributes["data-value"].value

page_temp.xpath(&#39; //利&#39;)first.attributes。[&#34;数据值&#34]。值    #=&GT; datav1

现在为val1

该nokogiri实例还有一个children属性,它包含元素text / content

所以

page_temp.xpath('//li').first.children
=> [#<Nokogiri::XML::Text:0x182781c "val1">]
page_temp.xpath('//li').first.children.first.content
=> val1

现在在循环中得到两个欲望输出元素,将这些作为page_temp.xpath('//li').first替换为node并以希望的字符串格式显示。

所以它会是

"#{node.attributes['data-value'].value}:#{node.children.first.content}"

答案 1 :(得分:1)

这应该这样做。

page_temp.xpath('//li').each do |node|
  puts "#{node['data-value']}:#{node.text}"
end

代码不言自明,但让我解释一下。您循环遍历所有li元素,并打印data-value属性的值以及li元素中包含的文字。

答案 2 :(得分:0)

这项工作

<style>.Middle {
position: absolute;
margin-left: auto;
margin-right: auto;
left: 0;
right: 0;
width: 1350px;
background-color: blue;
border: 0px solid black;
} 
</style>
<div align="center" class="Middle">
<select onChange="window.location.href=this.value">
  <option>Change data</option>
  <option value="http://www.mrdicky.cf/">data1</option>
  <option value="http://www.mrdicky.cf/">data2</option>
  <option value="http://www.mrdicky.cf/">data3</option>
</select>