2017-02-26 13 views
7

Próbuję uzyskać wszystkie <tr class="**colour blue** attr1 attr2"> ze strony.Jaki jest odpowiednik "*" dla Beautifulsoup - find_all?

The attrs różnią się za każdym razem, i niektóre inne rodzeństwo <tr>s mieć colour red, colour pink itd klas.

Poszukuję więc innych postaci po colour blue w class do uwzględnienia w wyniku. Próbowałem za pomocą *, ale to nie działa:

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

Dziękuję

+0

więc, aby było jasne, nic nie może się pojawić * przed * "kolor", ale wszystko może być "niebieskie"? Np. "Color bluegray maxsize tall" pasowałoby, ale "altcolour bluegreen" by nie pasowało? –

+0

W takim przypadku możliwy duplikat: http://stackoverflow.com/a/16421470/1085062 –

+0

Próbowałem rozwiązania z tam, po prostu wrócił puste listy, z jakiegoś powodu – StevenH

Odpowiedz

6

można użyć powszechnie stosowane CSS Selectors z pięknym zupy:

>>> 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 selektor będzie pasował tr o ile ma atrybuty klasy colours i blue.

+0

Pracowałem, dziękuję! – StevenH

1

Zastosowanie regex filter:

import re 

soup.find_all('tr', class_=re.compile(r'colour blue.+')) 
  • W regex, używa re.search() znaleźć ciąg.

  • . oznacza dopasować dowolny znak, z wyjątkiem nowego wiersza.

  • + oznacza więcej niż jeden raz dopasowania ..

+1

Teraz masz dwa problemy;) – TrakJohnson

Powiązane problemy