1

Html は次のようなものです。

<div class="score header">text i don't want</div><div class="score">text i want</div>

bs.find("div", attrs={"class":"score"}) のように美しいスープを実行し、最初の div タグと一致しています。bs がこのように動作していることに驚いています。明らかに bs.findAll(...)[1] を実行できますが、それはあまりにも醜い解決策だと思います。これをより適切に一致させるにはどうすればよいですか。

4

2 に答える 2

0

BeautifulSoup でのクラス マッチングは、class 属性のクラスごとに一致します。

指定されたクラス以上に一致する要素を除外するには、ジェネレータ式を使用できます。

next((el for el in bs.find_all("div", attrs={"class":"score"}) if el['class'] == ['score']), None)

これは、他のクラスが許可されていないクラスと正確に一致する最初の要素を返します。

于 2013-03-26T17:25:01.203 に答える
0

Firstにはとクラス<div>の両方があります。のない要素が必要な場合は、後でそれらをフィルタリングする必要がありますscoreheaderscore

items = soup.find_all(...)
good_items = [item for item in items if 'score' not in item['class']]

もちろん、フィルタリング条件は、正確に一致させたいものによって異なります

'score' not in item['class']

また

['score'] == item['class']

アイテムが持っているクラスの返品に注意してくださいitem['class']listしたがって、複数のクラスに一致させたい場合は、setを使用する必要があります

set(['foo', 'bar']) == set(item['class'])
于 2013-03-26T17:25:46.887 に答える