beautifulsoup attrs匹配太多了

时间:2013-03-26 17:16:58

标签: python beautifulsoup matching

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]但我认为这太难看了解决方案。我如何更恰当地匹配它。

2 个答案:

答案 0 :(得分:0)

BeautifulSoup中的类匹配匹配class属性中的 per 类。

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

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

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

答案 1 :(得分: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'])