美汤查询

Beautiful soup queries

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

我设法使用 lambda 语法分别获取它们:
bsObj.findAll(lambda tag: tag.name == "h1") 将 return h1
bsObj.findAll(lambda tag: tag.name == "span", {"class":"green"}) 将 return 跨越绿色

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

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

有人可以向我解释 one 查询中的正确方法吗?这里的目标不仅仅是获得结果,而是理解语法。谢谢!

(使用 Python 3.4)
PS :我认为这个问题与这里的问题不同:BeautifulSoup findAll() given multiple classes? as well as a variation of Python BeautifulSoup give multiple tags to findAll(因为我们想要一个特定的属性)

您可以使用 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'