在 Nokogiri 中同时访问两个元素

Access two elements simultaneously in Nokogiri

我有一些格式奇怪的 HTML 文件需要解析。

这是我的 Ruby 代码:

File.open('2.html', 'r:utf-8') do |f| 
    @parsed = Nokogiri::HTML(f, nil, 'windows-1251')
    puts @parsed.xpath('//span[@id="f5"]//div[@id="f5"]').inner_text
end

我想解析包含以下内容的文件:

<span style="position:absolute;top:156pt;left:24pt" id=f6>36.4.1.1. варенье, джемы, конфитюры, сиропы</span>
<div style="position:absolute;top:167.6pt;left:24.7pt;width:709.0;height:31.5;padding-top:23.8;font:0pt Arial;border-width:1.4; border-style:solid;border-color:#000000;"><table></table></div>
<span style="position:absolute;top:171pt;left:28pt" id=f5>003874</span>
<div style="position:absolute;top:171pt;left:99pt" id=f5>ВАРЕНЬЕ &quot;ЭКОПРОДУКТ&quot; ЧЕРНАЯ СМОРОДИНА</div>
<div style="position:absolute;top:180pt;left:99pt" id=f5>325гр.  </div>
<div style="position:absolute;top:167.6pt;left:95.8pt;width:2.8;height:31.5;padding-top:23.8;font:0pt Arial;border-width:0 0 0 1.4; border-style:solid;border-color:#000000;"><table></table></div>

我需要 select <div><span>id==5。使用我当前的 XPath select 或者这是不可能的。例如,如果我删除 //span[@id="f5"],那么 div 就会被正确地 selected。我可以一个接一个地输出:

puts @parsed.xpath('//div[@id="f5"]').inner_text
puts @parsed.xpath('//span[@id="f5"]').inner_text

但那样的话订单就会一团糟。解析后的 span 必须直接位于原始文件的 div 下方。

我是否缺少一些基础知识?我还没有在网上找到任何关于并行解析两个元素的内容。例如,大多数帖子都涉及解析 div 中的两个 类,而不是一次解析两个不同的元素。

如果我理解正确,您可以使用以下 XPath:

//*[self::div or self::span][@id="f5"]

xpathtester demo

上面的 XPath 将找到名为 divspanid 属性值等于 "f5"

的元素

输出:

<span id="f5" style="position:absolute;top:171pt;left:28pt">003874</span>

<div id="f5" style="position:absolute;top:171pt;left:99pt">ВАРЕНЬЕ "ЭКОПРОДУКТ" ЧЕРНАЯ СМОРОДИНА</div>

<div id="f5" style="position:absolute;top:180pt;left:99pt">325гр.</div>