我需要从html中提取节点(不是内部文本,因此我可以保留格式以进行进一步的手动调查)。我写了下面的代码。但是因为遍历如何工作,我在新的html文件中得到了重复。
这是要解析的真正的html。 http://www.sec.gov/Archives/edgar/data/1750/000104746912007300/a2210166z10-k.htm
基本上我需要提取Item10并将“注册人的执行官”之间的部分提取到下一个项目。第10项在所有文件中,但“注册人的执行官”不在所有文件中。我需要获取节点而不仅仅是文本,因为我想保留表,所以在下一步中我可以解析这些部分中的表(如果有的话)。
示例html:
html = "
<BODY>
<P>Dont need this </P>
<P>Start</P>
<P>Text To Extract 1 </P>
<P><Font><B>Text to Extract 2 </B></Font></P>
<DIV><TABLE>
<TR>
<TD>Text to Extract 3</TD>
<TD>Text to Extract 4</TD>
</TR>
</TABLE></DIV>
<P>End</P>
</BODY>
"
我想得到:
html = "
<BODY>
<P>Start</P>
<P>Text To Extract 1 </P>
<P><Font><B>Text to Extract 2 </B></Font></P>
<DIV><TABLE>
<TR>
<TD>Text to Extract 3</TD>
<TD>Text to Extract 4</TD>
</TR>
</TABLE></DIV>
<P>End</P>
</BODY>
"
在start_keyword出现时开始提取。 结束以在end_keyword出现时提取。
我需要从一个html中提取多个部分。关键字可以出现在具有不同名称的节点中。
doc.at_css('body').traverse do |node|
inMySection = false
if node.text.match(/#{start_keyword}/)
inMySection = true
elsif node.text.match(/#{end_keyword}/)
inMySection = false
end
if inMySection
#Extract the nodes
end
end
在参考这些帖子之后,我也尝试使用xpath来实现这一目标:
XPath axis, get all following nodes until
XPath to find all following siblings up until the next sibling of a particular type
答案 0 :(得分:1)
这不是Nokogiri的问题,而是你的算法。你已将你的旗帜inMySection
放入你的循环中,这意味着你在每一步都将它再次设置为false
,如果以前设置为真,你就会失败。
根据您的示例HTML输入和输出,以下代码段可用:
nodes = Nokogiri::HTML(html)
inMySection = false
nodes.at_xpath('//body').traverse do |node|
if node.text.match(/Start/)
inMySection = true
elsif node.text.match(/End/)
inMySection = false
end
node.remove unless inMySection
end
print nodes