Il modo migliore per analizzare un file con collegamenti esportati da Delicious.com utilizzando Nokogiri?
-
11-10-2019 - |
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?
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 § 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