我有一些格式怪异的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>ВАРЕНЬЕ "ЭКОПРОДУКТ" ЧЕРНАЯ СМОРОДИНА</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>
我需要用id==5
选择<div>
或<span>
。使用我当前的XPath选择器,这是不可能的。例如,如果我删除//span[@id="f5"]
,则div被正确选择。我可以一个接一个地输出它们:
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将查找名为div
或span
的元素,这些元素的id
属性值等于"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>