如何使用Beautiful soup在<span>标记内搜索特定的“class = id”类型属性?</span>

时间:2012-12-18 23:15:21

标签: python parsing beautifulsoup

我正在尝试使用BeautifulSoup抓取一个页面,该页面具有以下一般格式:

<span class="ID1"> TEXT </span>
<span class="ID2"> TEXT2 </span>

这些都存储在<div>中,因此我的通用代码模板如下所示:

for tag in soup.find_all('div'):
    print tag.find('span')

这会提取<span>中的所有div代码,但我无法弄清楚如何在<span>s内搜索。我尝试了tag.find('class').find('ID')之类的东西,但没有运气。

我可以通过获取对象的字符串表示然后测试它是否具有我正在寻找的ID来手动找到我正在寻找的东西,但这似乎是一种创可贴的方法。我确信有些东西我只是没有看到。

注意:我也尝试将ID的正则表达式传递给find函数ala:

for tag in soup.find_all('div'):
    print tag.find(re.compile('id2'))

遗憾的是,仍然没有运气。

那么,我如何搜索特定的类值?

*编辑[已解决]


我想出了如何通过BeautifulSoup的内置find函数来完成它,而无需手动检查其字典结构。

要使用find函数在html标记中选择特定的class=value,请将要查找的常规标记名称作为第一个参数传递(在我的情况下,它是部分一个''标签)。作为第二个参数,传入一个包含您要查找的特定'class' : 'value'的字典。

例如,如果我想要刮的HTML看起来像这样:

<div>
    <span class="ID1"> TEXT </span>
    <other HTML junk> 
    <span class="ID2"> TEXT2 </span>
</div>

我可以使用如下所示的语句。

for tag_elm in soup.find_all('div'):
    print tag_elm.find('span', {'class' : 'ID2'})

多田!

1 个答案:

答案 0 :(得分:1)

这应该有效:

for tag in soup.findAll('span'):
    if tag.has_key('class'):
        if tag['class'] == 'ID2':
            # do stuff

测试了这段代码:

from BeautifulSoup import BeautifulSoup

text = '''
<span class="ID1"> TEXT </span>
<span class="ID2"> TEXT2 </span>
'''

soup = BeautifulSoup(text)

for tag in soup.findAll('span'):
    if tag.has_key('class'):
        if tag['class'] == 'ID2':
            print tag.string
            break

提供以下输出:

TEXT2