美汤查询
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'
我很难在 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'