用 Beautiful Soup 搜索属性的片段
Searching for pieces of an attribute with Beautiful Soup
我想用 Beautiful Soup 提取任何格式如下:
div class="dog-a b-cat"
如果我知道 "a" 和 "b" 是什么,我可以通过执行以下操作(假设 a=aardvark
和 b=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
。
我想用 Beautiful Soup 提取任何格式如下:
div class="dog-a b-cat"
如果我知道 "a" 和 "b" 是什么,我可以通过执行以下操作(假设 a=aardvark
和 b=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
。