我很努力在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")
将返回H1
bsObj.findAll(lambda tag: tag.name == "span", {"class":"green"})
WIL回报跨度绿色
或者,我可以得到所有“跨度”标签和“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的变化(因为我们希望有一个特定的属性)
喜马蒂亚斯和你的答案非常感谢。你能否提供完整的语法?我试过:'bsObj.findAll(lambda t:(t.name ==“span”和t ['class'] == u'green')或t.name ==“h1”)'只有它返回h1。 – PLL
您需要首先检查'tag ['class']'是否返回单个值或列表。根据标准,它应该返回一个列表,但可能会有所不同。阅读[文档属性](http://www.crummy.com/software/BeautifulSoup/bs4/doc/#attributes)和多值属性确定表单是否适合您的需求。 –
对不起,我是初学者,我只是不明白。如果你可以提供一个可用的语法,那么我可以理解那么这将是非常好的... – PLL