2017-02-13 11 views
1

Я пытался соскрести Tumblr архив, класс DIV тег выглядит как дано в картинеИспользование регулярных выражений в find_all из BeautifulSoup

enter image description here

Класс начинается с «пост post_micro», я пытались использовать регулярное выражение, но не

soup.find_all(class_=re.compile('^post post_micro') 

Я пытался использовать функцию в find_all для класса

def func(x):     
    if str(x).startswith('post_tumblelog'): 
     return True 

и использовали его как:

soup.find_all(class_=func) 

выше работает отлично, и я получаю то, что мне нужно. Но я хочу знать, как сделать это с помощью регулярных выражений и почему в FUNC (х),

str(x).startswith('post_tumblelog') 

вычисляется как верно, когда имя класса начинается с «пост post_micro».

ответ

3

В BeautifulSoup 4 вы можете использовать .select() method, так как он может принимать селектор атрибутов CSS. В вашем случае вы должны использовать селектор атрибутов [class^="post_tumblelog"], который будет выбирать атрибуты class, начиная со строки post_tumblelog.

soup.select('[class^="post_tumblelog"]') 

Кроме того, вы также можете использовать:

soup.find_all(class_=lambda x: x and x.startswith('post_tumblelog')) 

Как примечание стороны, похоже, что вы пропали без вести скобки, следующие работы:

soup.find_all(class_=re.compile('^post_tumblelog')) 
+0

Использования .select дает error: Неподдерживаемый или недопустимый CSS-селектор: «[class^=« post »и остальные два параметра работают с« post_tumblelog », но не с« post post_micro », я не знаю, почему это происходит. – sandepp

+0

да 2 из они работают лямбда-фу nction и regular expression one, но переданный аргумент должен быть «post_tumblelog» – sandepp

+0

@sandepp - я только что проверил его со строками 'post_tumblelog' и' post post_micro', и они оба работали. Не возражаете ли вы опубликовать свой HTML-код и опубликовать какую версию BeautifulSoup вы используете? –