我有这样的HTML代码:
<div id="first">
<dt>Label1</dt>
<dd>Value1</dd>
<dt>Label2</dt>
<dd>Value2</dd>
...
</div>
Run Code Online (Sandbox Code Playgroud)
我的代码不起作用.
doc.css("first").each do |item|
label = item.css("dt")
value = item.css("dd")
end
Run Code Online (Sandbox Code Playgroud)
显示所有<dt>标签第一,然后<dd>标签,我需要"标签:价值"
首先,您的HTML应该包含以下内容<dt>和<dd>元素<dl>:
<div id="first">
<dl>
<dt>Label1</dt>
<dd>Value1</dd>
<dt>Label2</dt>
<dd>Value2</dd>
...
</dl>
</div>
Run Code Online (Sandbox Code Playgroud)
但这不会改变你解析它的方式.你想找到<dt>s并迭代它们,然后在每个<dt>你可以next_element用来获得<dd>; 这样的事情:
doc = Nokogiri::HTML('<div id="first"><dl>...')
doc.css('#first').search('dt').each do |node|
puts "#{node.text}: #{node.next_element.text}"
end
Run Code Online (Sandbox Code Playgroud)
只要结构与您的示例匹配,这应该有效.
假设有些<dt>可能有多个<dd>,你想要找到所有<dt>,然后(对于每个)<dd>在下一个之前找到以下内容<dt>.这在纯Ruby中非常容易,但在XPath中更有趣.;)
鉴于此设置:
require 'nokogiri'
html = '<dl id="first">
<dt>Label1</dt><dd>Value1</dd>
<dt>Label2</dt><dd>Value2</dd>
<dt>Label3</dt><dd>Value3a</dd><dd>Value3b</dd>
<dt>Label4</dt><dd>Value4</dd>
</dl>'
doc = Nokogiri.HTML(html)
Run Code Online (Sandbox Code Playgroud)
不使用XPath:
doc.css('dt').each do |dt|
dds = []
n = dt.next_element
begin
dds << n
n = n.next_element
end while n && n.name=='dd'
p [dt.text,dds.map(&:text)]
end
#=> ["Label1", ["Value1"]]
#=> ["Label2", ["Value2"]]
#=> ["Label3", ["Value3a", "Value3b"]]
#=> ["Label4", ["Value4"]]
Run Code Online (Sandbox Code Playgroud)
使用Little XPath:
doc.css('dt').each do |dt|
dds = dt.xpath('following-sibling::*').chunk{ |n| n.name }.first.last
p [dt.text,dds.map(&:text)]
end
#=> ["Label1", ["Value1"]]
#=> ["Label2", ["Value2"]]
#=> ["Label3", ["Value3a", "Value3b"]]
#=> ["Label4", ["Value4"]]
Run Code Online (Sandbox Code Playgroud)
使用Lotsa XPath:
doc.css('dt').each do |dt|
ct = dt.xpath('count(following-sibling::dt)')
dds = dt.xpath("following-sibling::dd[count(following-sibling::dt)=#{ct}]")
p [dt.text,dds.map(&:text)]
end
#=> ["Label1", ["Value1"]]
#=> ["Label2", ["Value2"]]
#=> ["Label3", ["Value3a", "Value3b"]]
#=> ["Label4", ["Value4"]]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1968 次 |
| 最近记录: |