2

我需要从 html 中提取节点(不是内部文本,因此我可以保留格式以供进一步手动调查)。我写了下面的代码。但是由于 traverse 的工作原理,我在新的 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 轴,获取所有后续节点,直到

XPath 查找所有后续兄弟姐妹,直到特定类型的下一个兄弟姐妹

4

1 回答 1

1

这不是 Nokogiri 的问题,而是你的算法的问题。您已将标志inMySection放入循环中,这意味着在每个步骤中您再次将false其设置为,如果之前设置为 true,您将失败。

根据您的示例 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
于 2013-03-03T00:16:03.467 回答