Python中BeautifulSoup如何select具有两个class值的标签?

<p class="temp">文本内容</p>

如果 class 里面只有一个值,就用 soup.select('.temp')

<p class="temp temp-low">文本内容</p>

如果有两个的话,不管我写成 soup.select('.temp.temp-low') 还是 soup.select('.temp .temp-low') 结果都不是预期想要的。


Python中BeautifulSoup如何select具有两个class值的标签?

8 回复

在BeautifulSoup里用CSS选择器选带多个class的标签,直接用点号连起来就行,但要注意两个class之间不能有空格

比如你要找同时有class1class2<div>标签,就这么写:

from bs4 import BeautifulSoup

html = '''
<div class="class1 class2">目标标签</div>
<div class="class1">只有class1</div>
<div class="class2">只有class2</div>
'''

soup = BeautifulSoup(html, 'html.parser')

# 正确写法:两个class之间没有空格
results = soup.select('div.class1.class2')
print(results)  # 输出: [<div class="class1 class2">目标标签</div>]

# 错误写法:加了空格就变成找子元素了
wrong_results = soup.select('div.class1 .class2')
print(wrong_results)  # 输出: []

关键点:

  • div.class1.class2 → 找同时有这两个class的div
  • div.class1 .class2 → 找class1的div里面的class2元素(这是错的)

如果class名里有特殊字符(比如冒号、空格),用反斜杠转义或者用属性选择器:

# 方法1:用反斜杠转义
soup.select('div.class\:name.another-class')

# 方法2:用属性选择器(更可靠)
soup.select('div[class="class:name another-class"]')

一句话建议:多个class选择直接用点连,别加空格。

soup.find(‘p’, ,{‘class’: ‘temp temp-low’})

soup.find(‘p’, {‘class’: ‘temp temp-low’})

我想用 select,该怎么做呢?

temps_tag = seven_day.select(’.temp’)

我一般都用 find,你可以尝试通过属性的值来查找
例如:soup.select(‘p[class=“temp temp-low”]’)
你试一下是不是可以,我不确定是否可行

哦,这样似乎不可以。select 就是一层层往下选的。例如: seven_day.select(’.tombstone-container img’)

pyquery 就好了

回到顶部