Scrapy: как получить все строки между двумя регулярными выражениями - PullRequest
0 голосов
/ 05 декабря 2018

Я пытаюсь почистить содержимое этого сайта .Как показано ниже, у меня есть список всех абзацев, содержащих регулярное выражение "\ d + \ s (\ w {3})".

events = response.xpath('//p[re:match(text(), "\d+\s\(\w{3}\)")]').extract()

Я хочу, чтобы регулярное выражение получало весь текст между "\ d + \ s (\ w {3})" и "\ d {2} 00" из каждого абзаца, исключая сопоставленные с регулярным текстом тексты.

Ниже работает, но я хочу строку между ними.

for ev in events:
     event_detail = re.search(r'\d+\s\(\w{3}\).*?\d{2}00', ev)

Я попробовал ниже, но не повезло, но получил ошибку "sre_constants.error: для просмотра требуется шаблон фиксированной ширины":

for ev in events:
    event_detail = re.search('(?<=(\d+\s\(\w{3}\))(.*?)(\d{2}00)', ev)
    print(event_detail)

Как я могу написать правильное регулярное выражение, используя lool-behind и упреждающий просмотр?

[Решено] Я избавился от "+" в моем регулярном выражении.Ниже работает отлично.

for ev in events: event_detail = re.search(r'(?<=\d\s\(\w{3}\)).*(?=\d{2}00)', ev) print(event_detail)

1 Ответ

0 голосов
/ 05 декабря 2018
import re
import requests
from bs4 import BeautifulSoup

url = 'http://www.alfie.tokyo/schedule/201812.html'
r = requests.get(url)
soup = BeautifulSoup(r.content, 'html.parser')

re.findall('\d+\s\w{3}.*\d{2}:00', soup.prettify())

вывод:

['30 1st. 20:00',
 '00 演奏1st. 19:30 2nd. 21:00',
 '30 1st. 20:00',
 '00 演奏1st.19:30 2nd. 21:00']

Примечание. Полагаю, вы имели в виду \ d {2}: 00, а не \ d {2} 00

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