2013-03-26 55 views
1

HTML是这样的:beautifulsoup ATTRS匹配太多

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

我beautifulsoup这样,bs.find( “格”,ATTRS = { “类”: “分数”}),它是匹配第一个div标签。我很惊讶bs是这样做的。显然我可以做bs.findAll(...)[1],但我认为这太难看了。我如何更恰当地匹配这个。

+0

BeautifulSoup是一个HTML解析器,因此它会寻找*含*指定类的类属性。就像CSS规则一样。 – 2013-03-26 17:19:43

回答

0

BeautifulSoup中的类匹配匹配/类属性中的类。

为了滤除匹配比规定的类元素,可以使用信号发生器表达式:

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

这返回该类没有其它类完全匹配第一元件允许。

0

第一个<div>既有score也有header类。如果你想元素,而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'])