Я пытаюсь использовать Scrapy для извлечения и очистки некоторого текста из p
, который содержит встроенные значки и другие теги. В частности, я хочу заменить теги изображений текстом, извлеченным из атрибута image src
:
from scrapy.selector import Selector
text = '''
<p id="1"><b><br></b>For service <i>to </i>these stations, take the <img src="images/1.png"> to 72 St or Times Sq-42 St and transfer
<br>to an uptown <img src="images/1.png"> or <img src="images/2.png"> <i>local</i>.
<br>
<br>For service <i>from </i>these stations, take the <img src="images/1.png"> or <img src="images/2.png"> to 72 St or 96 St and transfer
<br>to a South Ferry-bound <img src="images/1.png">.
<br><b>______________________________<br></b>
</p>
'''
sel = Selector(text=text)
# do stuff
В результате я ищу строку:
Для обслуживания на этих станциях возьмите (1) до 72 St или Times Sq-42 St и отправьтесь в местный (1) или (2) город. Для обслуживания от этих станций, возьмите (1) или (2) до 72 St или 96 St и перейдите к Южной паромной переправе (1).
Я могу извлечь текст из src
, используя:
node.css('img').xpath('@src').re_first(r'images/(.+).png')
но я застрял на том, как перебирать дочерние узлы и определять, является ли это текстовым узлом / как отфильтровывать другие встроенные теги. Вот где я нахожусь:
description = sel.css('p#1')
def clean_html(description):
for n in description.xpath('node()'):
if (n.xpath('self::img')):
yield n.xpath('@src').re_first(r'images/(.+).png')
if (n.xpath('self::text()')):
yield n.css('::text')
text = ''.join(clean_html(description))