2015-09-17 70 views
1

我很努力在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的变化(因为我们希望有一个特定的属性)

回答

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' 
+0

喜马蒂亚斯和你的答案非常感谢。你能否提供完整的语法?我试过:'bsObj.findAll(lambda t:(t.name ==“span”和t ['class'] == u'green')或t.name ==“h1”)'只有它返回h1。 – PLL

+0

您需要首先检查'tag ['class']'是否返回单个值或列表。根据标准,它应该返回一个列表,但可能会有所不同。阅读[文档属性](http://www.crummy.com/software/BeautifulSoup/bs4/doc/#attributes)和多值属性确定表单是否适合您的需求。 –

+0

对不起,我是初学者,我只是不明白。如果你可以提供一个可用的语法,那么我可以理解那么这将是非常好的... – PLL