You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 11:24:11