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 中的类匹配匹配类属性中的每个类。

要过滤掉与指定类匹配的元素,您可以使用生成器表达式:

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

这将返回与类完全匹配的第一个元素,不允许其他类。

于 2013-03-26T17:25:01.203 回答
0

首先<div>有两个scoreheader类。如果你想要没有 的元素score,你应该在之后过滤它们

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 回答