我想使用Beautiful Soup来提取以下格式的任何内容:
div class="dog-a b-cat"
如果通过执行以下操作知道“a”和“b”是什么,我可以得到一个特定的实例(假设a=aardvark
和b=boy
):
soup.find_all("div",class_="dog-aardvark boy-cat")
有什么方法可以用狗和猫以及两个破折号拉出所有实例(不管破折号之间的两个单词)?
答案 0 :(得分:2)
@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
。
答案 1 :(得分:0)
尝试使用regular expressions来概括您的参数。
import re
soup.find_all("div", class= re.compile(r"dog-.+ boy-.+")
以上内容会查找字符串dog-
后跟一个或多个字符,后跟[空格],然后是boy-
后跟一个或多个字符。