我正在尝试用BeautifulSoup刮取一个页面,该页面的通用格式如下:
<span class="ID1"> TEXT </span>
<span class="ID2"> TEXT2 </span>
这些都存储在<div>
中,所以我的通用代码模板如下所示:
for tag in soup.find_all('div'):
print tag.find('span')
这会调出div
中的所有<span>
标签,但我不知道如何在<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'})
塔达!
这应该有效:
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