用 Beautiful Soup 搜索属性的片段

Searching for pieces of an attribute with Beautiful Soup

我想用 Beautiful Soup 提取任何格式如下:

div class="dog-a b-cat"

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

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

有什么方法可以提取所有包含 dog 和 cat 以及中间有两个破折号的实例(不管破折号之间的两个词)?

尝试使用 regular expressions 来概括您的参数。

import re
soup.find_all("div", class= re.compile(r"dog-.+ boy-.+")

以上将查找字符串 dog- 后跟一个或多个字符,然后是 [space],然后是 boy- 后跟一个或多个字符。

@bourbaki4481472 总的来说是正确的,但由于多种原因,建议的解决方案将不起作用,首先指定的 正则表达式将与单个 class 在一个时间 ,因为 class 是一个特殊的 multi-valued attribute 并且以它结尾只是 语法不正确 .

我建议你制作一个 filtering function 来检查第一个 class 值是否以 dog- 开头,第二个以 -cat 结尾。如果需要,您可以通过额外检查标签名称或存在多少 class 值来改进它:

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