2017-02-06 5 views
2

Ich benutze Scrapy, um den Text von Nachrichtenartikeln von Nachrichtenseiten zu extrahieren. Ich gehe davon aus, dass der gesamte Text innerhalb von <p> Tags der eigentliche Artikel ist. (Was nicht unbedingt eine sichere Annahme, aber es ist was mit ich arbeite), um alle der <p> Tags zu finden, Scrapy lässt mich CSS-Selektoren verwenden, etwa so:Extrahieren Sie den gesamten Text aus beliebig verschachteltem HTML

response.css("p::text") 

Das Problem ist, dass einige Nachrichten Websites wie viel Markup in ihren Artikeln setzen, etwa so:

<p> 
    Senator <a href="/people/senator_whats_their_name">What&#39s-their-name</a> is <em>furious</em> about politics! 
</p> 

gibt es einen CSS-Selektor oder auf andere Weise einige einfache Weise innerhalb Scrapy, den Text und die Streifen alle Formatierungen zu extrahieren, so dass die Ergebnisse in ist etwas wie das?

Senator What's-their-name is furious about politics! 

Das Problem ist, dass diese Tags können theoretisch, verschachtelt werden willkürlich:

<p> 
    <span class="some-annoying-markup"><a href="who cares"><em>Wow this link must be important </em></a></span> 
<p> 

Und ich möchte noch den Text

Wow this link must be important 

Ich verstehe, extrahieren, dass dies eine ist ziemlich naive Möglichkeit, Inhalte aus einer HTML-Seite zu extrahieren, aber das ist außerhalb des Umfangs dieser Frage. Wenn es einen einfacheren Weg gibt, dies zu erreichen, werde ich Vorschläge machen, aber was ich zu diesem Thema gefunden habe, scheint viel komplizierter zu sein als das, was ich hier vorgestellt habe, also bin ich nur daran interessiert, das Problem zu lösen. ve präsentiert.

Antwort

1
In [7]: sel = Selector(text='''<p> 
    ...:  Senator <a href="/people/senator_whats_their_name">What&#39s-their-n 
    ...: ame</a> is <em>furious</em> about politics! 
    ...: </p>''') 

In [9]: sel.xpath('normalize-space(//p)').extract_first() 
Out[9]: "Senator What's-their-name is furious about politics!" 

OR:

In [10]: sel = Selector(text='''<p> 
    ...:  <span class="some-annoying-markup"><a href="who cares"><em>Wow this 
    ...: link must be important </em></a></span> 
    ...: <p>''') 

In [11]: sel.xpath('normalize-space(//p)').extract_first() 
Out[11]: 'Wow this link must be important' 

die Nutzung von XPath string Funktion der gesamten Text unter einem Tag verketten.

normalize-space wird den Leerraum in der Zeichenfolge entfernen.

Verwandte Themen