2017-02-06 2 views
2

私はScrapyを使用して、ニュースサイトからニュース記事のテキストを抽出しています。私は<p>タグ内のすべてのテキストが実際の記事であると仮定しています。 (どちらが必ずしも安全な仮定ではありませんが、それは私が働いているものです)<p>タグのすべてを見つけることのように、Scrapyは、私はCSSセレクタを使用することができます:任意のネストされたHTMLからすべてのテキストを抽出します

response.css("p::text") 

問題は、一部のニュースですサイトはそのように、自分の記事でマークアップの多くを置くのが好き:それはでの結果であるので

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

は、テキストを抽出し、すべての書式を削除するために、CSSセレクタ、あるいはScrapy内のいくつかの簡単な方法がありますこのようなもの?

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

そして、私はまだ

Wow this link must be important 

が、私はこれがあることを理解してテキストを抽出したい:

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

問題は、これらのタグは、理論的には、任意に入れ子にすることができることですHTMLページからコンテンツを抽出するためのかなり簡単な方法ですが、これはこの質問の範囲外です。これを達成するためのより簡単な方法がある場合は、私は提案をしますが、このトピックで見つかったことは、ここに示したものよりもはるかに複雑であるように見えます。私は提示した。

答えて

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' 

使用するXPathのstring機能は、タグの下にあるすべてのテキストを連結します。

normalize-spaceは、文字列の空白を削除します。

関連する問題