gpt4 book ai didi

ruby - Nokogiri XML Builder 在抓取 HTML 时创建意外输出

转载 作者:数据小太阳 更新时间:2023-10-29 08:54:31 25 4
gpt4 key购买 nike

我对 Ruby 和编程世界还很陌生,所以请多多包涵。

我的目标是抓取一个表格,然后将数据保存到一个 XML 文件中。我编写的简单脚本成功地完成了这两件事。我遇到的问题是 XML 的保存方式。它与我习惯看到的 XML 不匹配。

我已经翻遍了大量示例、教程和论坛,但尚未找到解决方案。

我也乐于接受有关从表中获取数据的更好方法的任何建议,特别是因为前三列是我真正需要的。帮助!!!

这是我的脚本:

require 'nokogiri'
require 'open-uri'

url = "http://www.covers.com/pageLoader/pageLoader.aspx?page=
/data/nba/team/pastresults/2010-2011/team404085.html"
doc = Nokogiri::HTML(open(url))

builder = Nokogiri::XML::Builder.new do |xml|
xml.root {
xml.items {
doc.css('.data').each do |o|
xml.item_content = o
end
}
}
end

File.open('ATL.xml','w'){|f| f.write builder.to_xml}

puts "Scrape Completed."

无论是保存到 .xml 文件还是在 Ruby 中打印在屏幕上,XML 看起来都是这样的:

<?xml version="1.0"?>
<root>
<items>
<item_content=>&lt;table cellpadding="2" cellspacing="1" class="data"&gt;
&lt;tr class="datahead"&gt;
&lt;td width="11%"&gt;Date&lt;/td&gt;&#xD;
&lt;td width="21%"&gt;Vs&lt;/td&gt;&#xD;
&lt;td width="18%"&gt;Score&lt;/td&gt;&#xD;
&lt;td width="27%"&gt;Type&lt;/td&gt;&#xD;
&lt;td width="13%"&gt;ATL Line&lt;/td&gt;&#xD;
&lt;td width="10%"&gt;O/U&lt;/td&gt;&#xD;
&lt;/tr&gt;
&lt;tr class="datarow"&gt;
&lt;td&gt;&#xD;
01/18/11&lt;/td&gt;&#xD;
&lt;td&gt;&#xD;
@ &lt;a href="/pageLoader/pageLoader.aspx?page=/data/nba/team/
team404171.html"&gt;Miami&lt;/a&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td&gt;&#xD;
W &lt;a href="/pageLoader/pageLoader.aspx?page=/data/nba/
results/2010-2011/boxscore795345.html"&gt;&#xD;
93-89&lt;/a&gt; (OT)&lt;/td&gt;&#xD;
&lt;td&gt;&#xD;
Regular Season&lt;/td&gt;&#xD;
&lt;td&gt;&#xD;
W 5.5&lt;/td&gt;&#xD;
&lt;td&gt;&#xD;
U 194&lt;/td&gt;&#xD;
&lt;/tr&gt;

上面的代码只是一个片段,因为有多行。 (共 44 个)
执行此操作的最佳方法是什么?

最佳答案

不清楚您想要什么作为输出;您是要将原始文件中的 HTML 包含在 XML 中,还是只包含 HTML 的内容?将来,当您包含一个您想要的示例以及一个问题示例时,这会很有帮助。让我们解决这两个问题。首先,我们可以像这样更简单地重现您的问题:

require 'nokogiri'
doc = Nokogiri::XML <<ENDXML
<root>
<p class="foo">42</p>
<p class="bar">99</p>
<p class="foo">17</p>
</root>
ENDXML

builder = Nokogiri::XML::Builder.new do |xml|
xml.items {
doc.css('.foo').each{ |o| xml.item_content = o }
}
end
puts builder.to_xml
#=> <?xml version="1.0"?>
#=> <items>
#=> <item_content=>&lt;p class="foo"&gt;42&lt;/p&gt;</item_content=>
#=> <item_content=>&lt;p class="foo"&gt;17&lt;/p&gt;</item_content=>
#=> </items>

如果您只希望 XML 中的 HTML 节点内容,并且假设您不希望等号成为标记名称的一部分,那么:

builder = Nokogiri::XML::Builder.new do |xml|
xml.items {
doc.css('.foo').each{ |o| xml.item_content( o.text ) }
}
end
puts builder.to_xml
#=> <?xml version="1.0"?>
#=> <items>
#=>   <item_content>42</item_content>
#=>   <item_content>17</item_content>
#=> </items>

另一方面,如果您确实想要 XML 中的原始 HTML,但不想要所有实体,则将其设为 CDATA block :

builder = Nokogiri::XML::Builder.new do |xml|
xml.items {
doc.css('.foo').each{ |o| xml.item_content{ xml.cdata o } }
}
end
puts builder.to_xml
#=> <?xml version="1.0"?>
#=> <items>
#=> <item_content><![CDATA[<p class="foo">42</p>]]></item_content>
#=> <item_content><![CDATA[<p class="foo">17</p>]]></item_content>
#=> </items>

一个 XML CDATA block允许您使用通常为 XML 标记保留的字符,而无需将它们表示为字符实体。

关于ruby - Nokogiri XML Builder 在抓取 HTML 时创建意外输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4766024/

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