Как получить <p>, который содержит текст, который соответствует регулярному выражению - PullRequest
0 голосов
/ 21 ноября 2018

Я пытаюсь очистить этот веб-сайт , используя scrapy, xpath и regex.Я проверил и попробовал ответы на этот вопрос: xpath + regex: соответствует тексту

Я хочу создать 'scrapy.selector.unified.SelectorList' из <p>, который содержит текст«11 (солнце)» или «9 (пт)» и т. Д., И цикл по списку.

event = response.xpath('//p[matches(text(), "\d+\s\(\w{3}\)")]').extract()

не работает.

К вашему сведению, ниже работает.

event = response.xpath('//p[contains(text(), "11 (sun)")]').extract()

Что мне здесь не хватает?

Ответы [ 2 ]

0 голосов
/ 21 ноября 2018

Если вы только после текста, ответ Каран Верма достаточно.
Если вам нужны сами элементы, продолжайте чтение.

matches доступно только в XPath 2.0 и более поздних версиях (как и другие функции регулярных выражений) и недоступно в scrapy.

Scrapy использует синтаксический анализ для анализа, который, в свою очередь, использует lxml, который поддерживает только XPath 1.0.
Однако он поддерживает регулярные выражения в пространстве имен EXSLT

Так какпространство имен regex по умолчанию включено в scrapy, вы можете сделать это:

event = response.xpath('//p[re:match(text(), "\d+\s\(\w{3}\)")]')
0 голосов
/ 21 ноября 2018

Вы можете использовать re() вместо extract(). Вызвать метод .re () для каждого элемента в этом списке и вернуть их результаты в виде списка строк Unicode..re () возвращает список строк Unicode.Поэтому вы не можете создавать вложенные вызовы .re ().

event = response.xpath('//p/text()').extract("\d+\s\(\w{3}\)")

Примечание : re () декодирует HTML-сущности (кроме <и &). </p>

Для получения дополнительной информации см. Документ здесь: https://doc.scrapy.org/en/latest/topics/selectors.html#scrapy.selector.SelectorList.re

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...