如何用BeautifulSoup筛选含指定h3标签的div元素
问题描述
想要抓取网站https://mentalmars.com/gear/brightside中的特定文本内容。目前代码可以获取所有class为wpb_text_column wpb_content_element的div元素,但这些div的内容和数量会随搜索内容变化,因此需要仅筛选出内部包含文本为**"Special Weapon Effect:"**的h3标签的div元素。
作为新手,已查阅尽可能多的BeautifulSoup文档,尝试将每个div转换为列表对象逐一解析以查找指定标签,但在转换ResultSet元素时遇到问题,陷入困境。
现有代码如下:
import requests from bs4 import BeautifulSoup inp = 'brightside' # 请替换为你的User-Agent headers = {'User-Agent': '...'} url = f'https://mentalmars.com/gear/{inp}/' r = requests.get(url, headers) soup = BeautifulSoup(r.content, 'html.parser') x = soup.find_all('div', class_="wpb_text_column wpb_content_element")
符合需求的目标div示例:
<div class="wpb_text_column wpb_content_element"> <div class="wpb_wrapper"> <h3>Special Weapon Effect:</h3> <p><span style="color: #ff0000;">“It’s killing me.”</span></p> <ul> <li>On Weapon Throw it will spawn 4 shotguns that each have their own unique element. These will home into a nearby enemy and start shooting at it. Each shotgun will explode in their respected element.</li> <li>The x18 and x20 versions will consume 2 ammo per shot</li> </ul> </div> </div>
同class但不符合需求的div示例:
<div class="wpb_text_column wpb_content_element"> <div class="wpb_wrapper"> <h3>Weapon Stats:</h3> <table> <tbody> <tr> <td><strong>Level:</strong></td> <td>60+</td> </tr> <tr> <td><strong>Damage:</strong></td> <td>1778×13</td> </tr> <tr> <td><strong>Accuracy:</strong></td> <td>49%</td> </tr> <tr> <td><strong>Handling:</strong></td> <td>61%</td> </tr> <tr> <td><strong>Reload Time:</strong></td> <td>2.0s</td> </tr> <tr> <td><strong>Fire Rate:</strong></td> <td>1.43/s</td> </tr> <tr> <td><strong>Magazine Size:</strong></td> <td>8</td> </tr> </tbody> </table> </div> </div>
解决方案
方法一:遍历筛选已获取的div列表
直接遍历ResultSet对象(本身可迭代),对每个div检查是否包含符合条件的h3标签:
import requests from bs4 import BeautifulSoup inp = 'brightside' headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36'} url = f'https://mentalmars.com/gear/{inp}/' r = requests.get(url, headers) soup = BeautifulSoup(r.content, 'html.parser') all_divs = soup.find_all('div', class_="wpb_text_column wpb_content_element") # 筛选目标div target_divs = [] for div in all_divs: h3 = div.find('h3') # 检查h3存在且文本匹配目标内容 if h3 and 'Special Weapon Effect:' in h3.text.strip(): target_divs.append(div) # 输出第一个目标div的格式化内容 if target_divs: print(target_divs[0].prettify())
方法二:用CSS选择器精准定位
利用BeautifulSoup 4.7.0+支持的:has()和:contains()伪类,一步定位目标div:
import requests from bs4 import BeautifulSoup inp = 'brightside' headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36'} url = f'https://mentalmars.com/gear/{inp}/' r = requests.get(url, headers) soup = BeautifulSoup(r.content, 'html.parser') # CSS选择器:定位包含指定文本h3的目标div target_divs = soup.select('div.wpb_text_column.wpb_content_element:has(h3:contains("Special Weapon Effect:"))') # 输出结果 if target_divs: print(target_divs[0].prettify())
补充说明
- 方法一逻辑直观,适合新手理解;方法二代码更简洁,定位效率更高;
- 务必填写有效的
User-Agent,避免被网站反爬机制拦截; - 若需提取目标div内的具体内容(如段落文本、列表项),可在拿到
target_divs后,继续用find()/find_all()定位子元素提取信息。
内容的提问来源于stack exchange,提问作者riley9
相关产品推荐
相关产品推荐

