Вопрос по python, beautifulsoup, regex – Регулярное выражение Python для Beautiful Soup

5

Я использую Beautiful Soup для извлечения определенных тегов div, и кажется, что могуне использовать простое сопоставление строк.

На странице есть несколько тегов в виде

 

который я хочу игнорировать, а также некоторые теги в виде

 

где х 's представляет целое число произвольной длины, а эллипсы представляют произвольное число других значений, разделенных пробелами (то есть I 'меня это не касается). Я могу'не могу понять правильное выражение регулярного выражения, тем более что ямы никогда не использовали Python 'с ре классом.

С помощью

soup.find_all(class_="comment") 

находит все теги, начинающиеся со слова комментария. Я пытался использовать

soup.find_all(class_=re.compile(r'(comment)( )(comment)'))
soup.find_all(class_=re.compile(r'comment comment.*'))

и много других вариантов, но я думаю, чтоЯ упускаю что-то очевидное здесь о том, как работают выражения regex или match (). Может кто-нибудь мне помочь?

Извините, BS4 - я не вставил прямо из моего кода, буду редактировать. user1890572
Блин, потому что у меня был ответ для BS3… но для BS4, похоже, нене нравится пробелы в классах, может быть? Или, может быть, я просто нене знаю BS4 достаточно хорошо. Я могу соответствовать'comment', но нет'comment comment', Я'Я посмотрю на это. abarnert
Во-первых, вы используете BS3 или BS4? НадоfindAll, надоfind_allни то, ни другое ...findall abarnert

Ваш Ответ

1   ответ
15

у нас это есть:

>>> [div['class'] for div in soup.find_all('div')]
[['comment', 'form', 'new'], ['comment', 'comment-xxxx...']]

Обратите внимание, что, в отличие от аналога в BS3, этоне это:

['comment form new', 'comment comment-xxxx...']

И этопочему твои регулярные выражения выиграли?т совпадают.

Но вы можете сопоставить, например, это:

>>> soup.find_all('div', class_=re.compile('comment-'))
[<div class="comment comment-xxxx..."></div>]

Обратите внимание, что BS делает эквивалентre.searchнеre.matchтак что ты нене нужно'comment-.*', Конечно, если вы хотите соответствовать'comment-12345' но нет'comment-of-another-kind вы'хочу, например.'comment-\d+'

Я помню, что читал что-то об этом в документации BS4, но этовсе еще нелогично. Спасибо большое! Я ударился головой об это в течение часа +. user1890572
@ user1890572: яЯ не уверен, почему, но я до сих порчитать документы BS4 за пределами третьей стороны "переход с BS3 " руководство, поэтому ямы привыкли путаться в подобных проблемах в моем собственном коде. Подумайте, если бы я был умнее, я быЯ не смог ответить. :) abarnert

Похожие вопросы