RegEx для сопоставления конкретного элемента HTML - PullRequest
2 голосов
/ 09 мая 2019

Я работаю над кодом Python, который извлекает определенные элементы из веб-сайтов и распечатывает их в графическом интерфейсе, реализованном с помощью модуля tkinter. Для извлечения определенных элементов из веб-страницы требуется использование регулярного выражения, к которому я в данный момент отношусь, и хотя я могу получать различные элементы, мне все еще трудно извлечь определенные элементы. Один из таких примеров представлен ниже.

<div class="updated published time-details"><a class="url" 
    href="https://thetriffid.com.au/gig/chocolate-starfish-one-last-kick/" 
    title="CHOCOLATE STARFISH (AUS) &#8220;ONE LAST KICK&#8221;" 
    rel="bookmark"><span class="tribe-event-date-start">Sat Aug 3 @ 8:00 
    pm</span>
    </a>
</div>

Это часть HTML-кода, из которой мне просто нужно название, т. Е. "Шоколадная морская звезда (AUS) и один последний удар". Я использую метод findall, и нам не разрешено использовать другую внешнюю библиотеку, такую ​​как Beautiful Soup. Итак, нам нужно работать с findall, finditer, MULTILINE и DOTALL.

Как мне получить желаемый результат?

Ответы [ 2 ]

2 голосов
/ 09 мая 2019

Это хорошее регулярное выражение для поиска тегов 'a' с атрибутом 'title', который находится в группе 2.

Струнный

r"(?si)<a(?=(?:[^>\"']|\"[^\"]*\"|'[^']*')*?\stitle\s*=\s*(['\"])(.*?)\1)(?:\".*?\"|'.*?'|[^>]*?)+>"

Читаемая версия

 (?si)

 <a
 (?=
      (?: [^>"'] | " [^"]* " | ' [^']* ' )*?
      \s title \s* = \s* 
      ( ['"] )                      # (1)
      ( .*? )                       # (2)
      \1 
 )
 (?: " .*? " | ' .*? ' | [^>]*? )+
 >

Тест с использованием большой веб-страницы (cnn.com) и 300 итераций

Regex1:   (?si)<a(?=(?:[^>"']|"[^"]*"|'[^']*')*?\stitle\s*=\s*(['"])(.*?)\1)(?:".*?"|'.*?'|[^>]*?)+>
Options:  < none >
Completed iterations:   300  /  300     ( x 1 )
Matches found per iteration:   285
Elapsed Time:    3.26 s,   3262.08 ms,   3262081 µs
Matches per sec:   26,210
2 голосов
/ 09 мая 2019

Использование решения с поддержкой HTML, такого как BeautifulSoup, будет обрабатывать больше случаев, но если вы уверены, что HTML всегда будет соответствовать вашему примеру, вы можете использовать грубое соответствие регулярному выражению, например:

re.findall('<a.*? title=\"(.*?)\"', html, re.DOTALL)
# ['CHOCOLATE STARFISH (AUS) &#8220;ONE LAST KICK&#8221;']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...