美丽的汤查询

时间:2015-09-17 07:26:49

标签: python lambda beautifulsoup operator-keyword

我很难在BS中使用AND或OR类型的多个条件进行查询。 从我读到的,我必须使用lambda。 例如,我正在寻找与" span",{" class":" green"}或tag.name ==&匹配的标签#34; H1"在页面http://www.pythonscraping.com/pages/warandpeace.html

我设法使用lambda语法单独获取它们:
    bsObj.findAll(lambda tag: tag.name == "h1")将返回h1
    bsObj.findAll(lambda tag: tag.name == "span", {"class":"green"})将返回绿色

或者我可以得到所有" span"标签和" h1" :
    bsObj.findAll(lambda tag: tag.name == "span" or tag.name == "h1")返回绿色和红色以及h1

但我没有设法获得类绿色或h1 的范围,因为以下代码未提供正确的结果:
bsObj.findAll(lambda tag: tag.name == "span", {"class":"green"} or tag.name == "h1")

可以请某人在一个查询中解释我正确的方法吗?这里的目标不仅是获得结果,而且还要理解语法。谢谢!

(使用Python 3.4)
PS:我认为这个问题与此处的问题不同:BeautifulSoup findAll() given multiple classes?以及Python BeautifulSoup give multiple tags to findAll的变体(因为我们需要特定的属性)

1 个答案:

答案 0 :(得分:0)

您可以使用tag['<attr_name>']语法访问属性。检查tag.attrs以查看此词典的确切内容。无论如何,您可以使用class属性搜索绿色。由于它是multi-valued attribute,您可能需要使用:

'green' in tag['class']

对于您的lambda构造,您应该使用and以及or

lambda t: (t.name == 'span' and 'green' in t.get('class',[])) or t.name == 'h1'