我想使用Beautiful Soup提取具有以下格式的所有内容:

div class="dog-a b-cat"


如果我通过执行以下操作(假设a=aardvarkb=boy)知道一个“ a”和“ b”是什么,则可以得到一个特定实例:

soup.find_all("div",class_="dog-aardvark boy-cat")


有什么办法可以拉出所有实例(无论破折号之间的两个单词如何),而其中的狗和猫又是两个破折号之间?

最佳答案

@ bourbaki4481472总体上是正确的,但是由于多种原因,建议的解决方案将无法正常工作,因为class是特殊的multi-valued attribute,因此指定的正则表达式将一次与单个类进行匹配,并且最后,在语法上完全不正确。

我建议您创建一个filtering function,以检查第一个类的值以dog-开头,第二个类的值以-cat结尾。您可以通过另外检查标签名称或如果需要的话提供多少类值来改进它:

def class_filter(elm):
    try:
        classes = elm["class"]
        return classes[0].startswith("dog-") and classes[1].endswith("-cat")
    except (KeyError, IndexError, TypeError):
        return False


完整的例子:

from bs4 import BeautifulSoup

data = """
<div class="dog-test test-cat">test1</div>
<div class="dog-test">test2</div>
<div class="test-cat">test3</div>
<div class="dog">test4</div>
<div class="cat">test5</div>
<div class="irrelevant">test6</div>
"""

soup = BeautifulSoup(data)

def class_filter(elm):
    try:
        classes = elm["class"]
        return classes[0].startswith("dog-") and classes[1].endswith("-cat")
    except (KeyError, IndexError, TypeError):
        return False

for elm in soup.find_all(class_filter):
    print(elm.text)


仅打印test1

10-08 19:54