我有一些奇怪的格式化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>
我需要选择<div>
或<span>
id==5
。使用我当前的XPath选择器是不可能的。例如,如果我删除//span[@id="f5"]
,则会正确选择div。我可以一个接一个地输出它们:
puts @parsed.xpath('//div[@id="f5"]').inner_text
puts @parsed.xpath('//span[@id="f5"]').inner_text
然后订单将是一个完整的混乱。解析后的span
必须直接位于原始文件的div
下方。
我错过了一些基础知识吗?我没有在网上找到关于两个元素的并行解析的任何内容。大多数帖子都关注解析div的两个类,例如一次解析两个不同的元素。
答案 0 :(得分:2)
如果我理解正确,您可以使用以下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>