假设我有一个名为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中读错了€
文件。
答案 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>