python
  • beautifulsoup
  • 2010-05-13 2 views 16 likes 
    16

    Я использую модуль BeautifulSoup - python. Мне нужно найти ссылку на div с id: «post-#». Например:Соответствие id в BeautifulSoup

    <div id="post-45">...</div> 
    <div id="post-334">...</div> 
    

    Как я могу фильтровать это?

    html = '<div id="post-45">...</div> <div id="post-334">...</div>' 
    soupHandler = BeautifulSoup(html) 
    print soupHandler.findAll('div', id='post-*') 
    > [] 
    
    +1

    Какую версию BeautifulSoup вы используете? –

    ответ

    40

    Вы можете передать функцию findAll:

    >>> print soupHandler.findAll('div', id=lambda x: x and x.startswith('post-')) 
    [<div id="post-45">...</div>, <div id="post-334">...</div>] 
    

    Или регулярное выражение:

    >>> print soupHandler.findAll('div', id=re.compile('^post-')) 
    [<div id="post-45">...</div>, <div id="post-334">...</div>] 
    
    +0

    AttributeError: объект «NoneType» не имеет атрибута «startswith» – Ockonal

    +2

    Я исправил «AttributeError». – jfs

    +1

    +1 для функции лямбда –

    1
    soupHandler.findAll('div', id=re.compile("^post-$")) 
    

    смотрит прямо на меня.

    +4

    Почему вы положили '' '? Я не думаю, что это будет работать, как рассчитывает ОП. –

    3

    Так как он просит, чтобы соответствовать "пост- # somenumber #", то лучше точным с

    import re 
    [...] 
    soupHandler.findAll('div', id=re.compile("^post-\d+")) 
    
    0

    Это работает для меня:

    from bs4 import BeautifulSoup 
    import re 
    
    html = '<div id="post-45">...</div> <div id="post-334">...</div>' 
    soupHandler = BeautifulSoup(html) 
    
    for match in soupHandler.find_all('div', id=re.compile("post-")): 
        print match.get('id') 
    
    >>> 
    post-45 
    post-334 
    
    Смежные вопросы