2011-01-22 9 views
2

Rubyとプログラミングの世界にはかなり新しいです。Nokogiri XML BuilderはHTMLを掻き集める際に予期せぬ出力を作成します

私の目標は、テーブルを削り取り、データをXMLファイルに保存することです。私が正常に書いた簡単なスクリプトは、両方のことを成し遂げます。私が抱えている問題はXMLの保存方法です。私が見慣れたXMLと一致しません。

私はかなりの例、チュートリアル、フォーラムをすっかり見つけ出しましたが、まだ解決策に到達していません。

特に最初の3つのカラムが本当に必要なので、テーブルからデータを取得するためのより良い方法については、私は何か提案しています。助けて!!!ここで

は私のスクリプトです:

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合計)
これを行う最善の方法は何ですか?

答えて

3

出力としてどのようなものが必要なのかは不明です。 XMLに含まれているオリジナルのHTML、または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> 

、そしてあなたがイコールには、タグ名の一部に署名したくありませんでした仮定:まず、我々はより簡単にそうようなあなたの問題を再現することができます、そして:

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ブロック作り、その後、すべてのエンティティをしたくなかった、場合:

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マークアップ用に予約された文字を、文字エンティティとして表現する必要なく使用できます。

+0

ご協力いただきありがとうございます。この問題は、コードのビルダー部分にあるように思えました.HTMLのテキストだけが必要だったからです。再度、感謝します! – darren

関連する問題