2017-02-26 138 views
7

我正试图从页面获取所有<tr class="**colour blue** attr1 attr2">Beautifulsoup的相当于'*'是什么 - find_all?

attrs每次都不一样,其他兄弟<tr>s有一些colour red,colour pink等类。

所以我正在寻找colour blueclass之后的任何其他字符以包含在结果中。我已经使用*尝试过,但没有奏效:

soup.find_all('tr', {'class': 'colour blue*'}) 

谢谢

+0

因此,要清楚,没有什么东西*之前*颜色,但任何可以跟随“蓝色”?例如,'color bluegray maxsize tall'会匹配,但'altcolour bluegreen'不会? –

+0

在这种情况下,可能的重复:http://stackoverflow.com/a/16421470/1085062 –

+0

我试过从那里的解决方案,他们只是返回空列表,由于某种原因 – StevenH

回答

6

您可以使用常见的CSS Selectors与美丽的汤:

>>> soup = BeautifulSoup(''' 
...  <tr class="colour blue attr1 attr2"></tr> 
...  <tr class="colour red attr1 attr2"></tr> 
...  <tr class="unwanted attr1 attr2"></tr> 
...  <tr class="colour blue attr3"></tr> 
...  <tr class="another attr1 attr2"></tr> 
... ''') 
>>> soup.select('tr.colour.blue') 
[<tr class="colour blue attr1 attr2"></tr>, <tr class="colour blue attr3"></tr>] 

tr.colours.blue选择将匹配tr只要它具有coloursblue类属性。

+0

工作,谢谢! – StevenH

1

使用regex filter

import re 

soup.find_all('tr', class_=re.compile(r'colour blue.+')) 
  • 在正则表达式,它使用re.search()查找的字符串。

  • .表示匹配除换行符以外的任何字符。

  • +表示匹配.不止一次。

+1

现在你有两个问题;) – TrakJohnson