2017-02-06 6 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, чтобы извлечь текст и зачистите все форматирование, так что это приводит к что-то вроде этого?

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

Проблема заключается в том, что эти теги, в теории, может быть произвольно вложенными:

<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 

Я понимаю, что это довольно наивный способ извлечь контент с 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!" 

ИЛИ:

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' 

string функция использование XPATH для конкатенации всего текста под тегом.

normalize-space лишит пустое пространство в строке.

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