BeautifulSoup:如何选择某些标签

时间:2013-04-10 07:53:19

标签: python beautifulsoup

当你想螃蟹一个标签的孩子时,我很困惑汤的美妙效果。 所以,我有以下HTML代码

<div class="media item avatar profile">
<a href="http://..." class="media-link action-medialink">
<img class="media-item-img" src="http://...jpeg" alt="name" title="name" width="150" height="200">
</a>
</div>    

我想抓住src标签。我使用以下代码:

soup = BeautifulSoup(file_)
for x in soup.find('div', attrs={'class':'media item avatar profile'}).findNext('img'):
    print x 

这会打印整个img标签。我如何只选择src?

谢谢。

3 个答案:

答案 0 :(得分:4)

srcattribute of the tag。获得标记后,像访问字典键一样访问属性;您只找到了a代码,因此您还需要导航到包含的img代码:

for x in soup.find_all('div', attrs={'class':'media item avatar profile'}):
    print x.a.img['src']

您使用的代码findNext()会返回标记对象;循环遍历为您提供子项,因此ximg对象。我改变了这一点,使其更直接,更清晰。 x现在是div,我们直接导航到第一个a并包含img标记。

答案 1 :(得分:3)

我想你会想要这样的东西:

soup.find('div', attrs={'class':'media item avatar profile'}).a.img['src']

In [1]: from bs4 import BeautifulSoup

In [2]: html = """\
   ...: <div class="media item avatar profile">
   ...: <a href="http://..." class="media-link action-medialink">
   ...: <img class="media-item-img" src="http://...jpeg" alt="name" title="name" width="150" height="200">
   ...: </a>
   ...: </div>"""

In [3]: soup = BeautifulSoup(html)

In [4]: soup.find('div', attrs={'class':'media item avatar profile'}).a.img['src']
Out[4]: 'http://...jpeg'

答案 2 :(得分:0)

findNext返回与给定条件匹配的第一个项目,并显示在文档中的给定标记之后。请注意,这意味着它返回的任何代码都不能保证是给定代码的(例如div代码的子代。)

使用findChildren限制给定标记的子级:

import BeautifulSoup as bs

file_ = '''<html>
<div class="media item avatar profile">
<a href="http://..." class="media-link action-medialink">
<img class="media-item-img" src="http://...jpeg" alt="name" title="name" width="150" height="200">
</a>
</div>  
</html>
'''
soup = bs.BeautifulSoup(file_)
for x in soup.find(
        'div', attrs={'class':'media item avatar profile'}).findChildren('img'):
    print(x['src'])

产量

http://...jpeg