我很难在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的变体(因为我们需要特定的属性)
答案 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'