Il modo migliore per analizzare un file con collegamenti esportati da Delicious.com utilizzando Nokogiri?

StackOverflow https://stackoverflow.com/questions/4477369

Domanda

Voglio analizzare un file html contenente collegamenti esportati da Delicious.Sto usando Nokogiri per l'analisi.Il file ha la seguente struttura:

<DT>
   <A HREF="http://mezzoblue.com/archives/2009/01/27/sprite_optim/"
      ADD_DATE="1233132422"
      PRIVATE="0"
      TAGS="irw_20">mezzoblue § Sprite Optimization</A>
<DT>
   <A HREF="http://datamining.typepad.com/data_mining/2008/11/minority-report-interface.html" 
      ADD_DATE="1226827542" 
      PRIVATE="0" 
      TAGS="irw_20">Minority Report Interface</A>
<DT>
   <A HREF="http://www.windowshop.com/" 
      ADD_DATE="1225267658" 
      PRIVATE="0" 
      TAGS="irw_20">Amazon Windowshop Beta</A>
<DD>Window shopping from Amazon

Come puoi vedere, le informazioni sul collegamento si trovano nel tag DT e alcuni collegamenti hanno un commento in un tag DD.

Faccio quanto segue per ottenere le informazioni sul collegamento:

doc.xpath('//dt//a').each do |node|
  title = node.text
  url = node['href']
  tags = node['tags']
  puts "#{title}, #{url}, #{tags}"
end

La mia domanda è: come posso ottenere le informazioni sul collegamento E il commento quando è presente un tag dd?

È stato utile?

Soluzione

La mia domanda è come posso ottenere le informazioni sul link e il commento quando è presente un tag DD?

Utilizzo:

//DT/a | //DT[a]/following-sibling::*[1][self::DD]

Questo seleziona tutto a elementi che hanno a DT genitore e tutto il resto DD elementi che sono l'elemento fratello immediatamente successivo di a DT elemento che ha un a bambino.

Nota:L'uso del // è fortemente sconsigliato perché solitamente comporta inefficienze e anomalie nell'utilizzo da parte degli sviluppatori.

Ogni volta che si conosce la struttura del documento XML, evitare di utilizzare il file // abbreviazione.

Altri suggerimenti

La tua domanda non è chiara su cosa stai cercando.

Innanzitutto, l'HTML non è valido perché il file <DT> i tag non sono chiusi correttamente e nel primo è presente un carattere non valido a il testo del tag che a Ruby 1.9.2 non piace perché non è UTF-8.Ho convertito il carattere in un'entità in TextMate.

html = %{
<DT>
  <A HREF="http://mezzoblue.com/archives/2009/01/27/sprite_optim/" ADD_DATE="1233132422" PRIVATE="0" TAGS="irw_20">mezzoblue &sect; Sprite Optimization</A>
<DT>
  <A HREF="http://datamining.typepad.com/data_mining/2008/11/minority-report-interface.html" ADD_DATE="1226827542" PRIVATE="0" TAGS="irw_20">Minority Report Interface</A>
<DT>
  <A HREF="http://www.windowshop.com/" ADD_DATE="1225267658" PRIVATE="0" TAGS="irw_20">Amazon Windowshop Beta</A>
<DD>Window shopping from Amazon
}

L'HTML analizza questo in Nokogiri dopo aver tentato di risolverlo:

(rdb:1) print doc.to_html
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><body>
<dt>
  <a href="http://mezzoblue.com/archives/2009/01/27/sprite_optim/" add_date="1233132422" private="0" tags="irw_20">mezzoblue § Sprite Optimization</a>
<dt>
  <a href="http://datamining.typepad.com/data_mining/2008/11/minority-report-interface.html" add_date="1226827542" private="0" tags="irw_20">Minority Report Interface</a>
<dt>
  <a href="http://www.windowshop.com/" add_date="1225267658" private="0" tags="irw_20">Amazon Windowshop Beta</a>
</dt>
</dt>
</dt>
<dd>Window shopping from Amazon
</dd>
</body></html>

Notare come si chiude dt i tag sono raggruppati appena prima dell'unico dd etichetta?È scomodo, ma ok perché non cambia il modo in cui dobbiamo cercare il file dd contenuto.

doc = Nokogiri::HTML(html, nil, 'UTF-8')

comments = []
doc.css('dt + dd').each do |a|
  comments << a.text
end
puts comments

# >> Window shopping from Amazon

Ciò significa: trova <dt> seguito da <dd>.Non/non puoi cercare dt seguito da a seguito da dd perché non è così che viene analizzato l'HTML.Lo sarebbe davvero dt seguito da dd, che è ciò"dt + dd" significa.

L'altro modo in cui sembrava che la tua domanda potesse essere letta era che stavi cercando il contenuto del file a tag:

comments = []
doc.css('a').each do |a|
  comments << a.text
end
puts comments

# >> mezzoblue § Sprite Optimization
# >> Minority Report Interface
# >> Amazon Windowshop Beta

presumo che:

<DD>Window shopping from Amazon

ha un tag finale /DD, non riesco a capirlo solo dal tuo frammento di pagina.Se è così, potresti fare:

comment = node.parent.next_sibling.next_sibling.text rescue nil

Devi chiamare next_sibling due volte perché il primo corrisponderà a (nuova riga) o spazio bianco.Potresti rimuovere tutte le nuove righe prima di analizzare la pagina per evitare la doppia chiamata.Potrebbe anche essere una buona idea nel caso in cui ci sia più di un carattere di nuova riga dopo il tag DT

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top