2011-01-22 3 views
2

Я довольно новичок в Ruby и мире программирования, поэтому, пожалуйста, несите меня.Nokogiri XML Builder создает неожиданный вывод при очистке HTML

Моя цель - очистить таблицу, а затем сохранить данные в файле 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 Итого)
Каков наилучший способ сделать это?

ответ

3

Непонятно, что вы хотите в качестве вывода; вы хотите, чтобы 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> 

Если вы хотите содержимое ваших HTML-узлов только в XML, и предполагая, что вы не хотите, знак равенства, чтобы быть частью имени тега , то:

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> 

Если, с другой стороны, вы же хотите сырой HTML в вашем XML, но не хотите, чтобы все объекты, затем сделать его 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

Спасибо, Phrogz за вашу помощь. Проблема, похоже, была в части кода для создания кода, так как мне нужен только текст из html. Еще раз спасибо! – darren

Смежные вопросы