Я использую scrapy для анализа HTML-файла, который выглядит следующим образом:
<p class = "title">
<a href = "#">#Who#</a>
I don't <em>know</em>
who you are
</p>
Я хочу извлечь весь текст, который не включает тег 'a' в теге 'p' в порядке. Итак, я ожидаю результата :
["I don't ", 'know', 'who you are']
Я пробовал использовать следующий код :
>>>selector = Selector(text = "<p class='title'><a href='#'>#Who#</a>I don't <em>know</em>who you are</p>")
>>>p_txt =selector.xpath('//p[@class = "title"]/text()').extract()
["I don't ", 'who you are']
В результате текст в теге em игнорируется. Я также пробовал использовать следующий код :
>>>p_txt =selector.xpath('//p[@class = "title"]/descendant::text()').extract()
['#Who#', "I don't ", 'know', 'who you are']
Но он также экспортирует текст в теге 'a'. Есть ли у кого-нибудь хорошее решение?
Спасибо
Попробуйте под XPath получить все текстовые узлы-потомки текстовых узлов p
без учета из a
:
//p[@class = "title"]//text()[not(parent::a)]
P.S. Если ссылка выглядит как <a href = "#">something <b>bold</b> inside</a>
, возможно, потребуется заменить (parent::a)
на (ancestor::a)
.
Попробуйте p_txt = [node.strip() for node in selector.xpath('//p[@class = "title"]//text()[not(parent::a)]').extract()]
Замечательно! Спасибо большое.
Спасибо за помощь. Я хочу спросить, как использовать
[not(parent::a)]
вnormalize-space()
, потому что мой возврат -["\n\t\t I don't ", 'know', 'who you are']
?