在Python中查找span标记内的多个属性

时间:2015-04-26 12:32:06

标签: python beautifulsoup

我希望从网站上获取两个值。它们存在于以下标记中:

<span class="sp starBig">4.1</span>
<span class="sp starGryB">2.9</span>

我需要值sp starBig,sp starGryB。

我正在使用的findAll表达式是 -

soup.findAll('span', {'class': ['sp starGryB', 'sp starBig']}):

代码执行时没有任何错误,但没有显示结果。

2 个答案:

答案 0 :(得分:10)

根据docs,假设Beautiful Soup 4,匹配多个CSS类与'sp starGryB'之类的字符串是脆弱的,不应该这样做:

soup.find_all('span', {'class': 'sp starGryB'})
# [<span class="sp starGryB">2.9</span>]
soup.find_all('span', {'class': 'starGryB sp'})
# []
应该使用

CSS selectors,如下所示:

soup.select('span.sp.starGryB')
# [<span class="sp starGryB">2.9</span>]
soup.select('span.starGryB.sp')
# [<span class="sp starGryB">2.9</span>]

在你的情况下:

items = soup.select('span.sp.starGryB') + soup.select('span.sp.starBig')

或更复杂的东西,如:

items = [i for s in ['span.sp.starGryB', 'span.sp.starBig'] for i in soup.select(s)]

答案 1 :(得分:2)

可能有一种更好的方法,但目前正在躲避我。可以使用这样的css选择器来完成:

html = '''<span class="sp starBig">4.1</span>
          <span class="sp starGryB">2.9</span>
          <span class="sp starBig">22</span>'''

soup = bs4.BeautifulSoup(html)

selectors = ['span.sp.starBig', 'span.sp.starGryB']
result = []
for s in selectors:
    result.extend(soup.select(s))