gpt4 book ai didi

html - Nokogiri 从 html 中提取节点

转载 作者:太空宇宙 更新时间:2023-11-03 16:32:03 25 4
gpt4 key购买 nike

我需要从 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

最佳答案

这不是 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

关于html - Nokogiri 从 html 中提取节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14269673/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com