【问题标题】:Beautiful soup queries美丽的汤查询
【发布时间】:2015-09-17 07:26:49
【问题描述】:

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

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

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

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

请有人在 one 查询中解释一下正确的方法吗?这里的目标不仅是获得结果,而且是理解语法。谢谢!

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

【问题讨论】:

    标签: python lambda beautifulsoup operator-keyword


    【解决方案1】:

    您可以使用tag['<attr_name>'] 语法访问属性。检查tag.attrs 以查看该字典包含的确切内容。无论如何,您可以使用class 属性搜索绿色。由于它是multi-valued attribute,您可能需要使用:

    'green' in tag['class']
    

    对于您的lambda 构造,您应该使用andor

    lambda t: (t.name == 'span' and 'green' in t.get('class',[])) or t.name == 'h1'
    

    【讨论】:

    • 嗨,马蒂亚斯,非常感谢您的回答。你能提供完整的语法吗?我试过了:bsObj.findAll(lambda t: (t.name == "span" and t['class'] == u'green') or t.name == "h1") 它只返回 h1。
    • 你需要先检查tag['class']是返回单个值还是列表。根据标准,它应该返回一个列表,但它可能会有所不同。阅读doc on attributes 和多值属性决定表单是否适合您的需求。
    • 对不起,我是初学者,我只是不明白。如果你能提供一个有效的语法会很棒,也许我能理解......
    • for t in bsObj.findAll(name='span'): print(t['class']) 输出什么?随意分享几行。
    • 它使用多值属性语法,然后。答案已更新。
    猜你喜欢
    • 2020-12-31
    • 2021-01-15
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 2010-10-27
    • 2020-12-13
    相关资源
    最近更新 更多