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

使用urllib3+正则提取网页数字失败,仅输出空列表求助

问题诊断与解决方案

1. 正则表达式错误:转义字符使用不当

你的正则里用了&lt;和&quot;,但实际网页内容解码后是原始HTML标签(<和"),不是HTML实体转义后的字符,这直接导致正则完全匹配不到目标内容。

修正后的正则应直接使用原始标签字符,同时增加灵活性以应对标签内的其他属性:

pattern = r'<span[^>]*class="text-subtle-100"[^>]*>([\d.]+)\s*coins</span>'
  • [^>]*:匹配标签内除>之外的任意字符,允许标签存在其他属性(如id、style等)
  • ([\d.]+):匹配数字和小数点,捕获目标数值

2. 反爬拦截:缺少请求头

很多网站会校验User-Agent字段,urllib3默认请求头可能被识别为爬虫,导致返回内容不完整。添加模拟浏览器的请求头即可解决:

def extract_dynamic_numbers_from_url(url):
    http = urllib3.PoolManager()
    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'
    }
    response = http.request('GET', url, headers=headers)
    content = response.data.decode('utf-8')
    pattern = r'<span[^>]*class="text-subtle-100"[^>]*>([\d.]+)\s*coins</span>'
    dynamic_numbers = re.findall(pattern, content)
    return dynamic_numbers

3. 动态内容加载问题:urllib3无法抓取JS渲染内容

如果上述调整后仍返回空列表,说明目标内容是通过JavaScript动态加载的(初始HTML中没有,后续通过AJAX获取)。urllib3只能获取静态HTML,无法执行JS,此时需使用支持JS渲染的工具,比如Selenium:

from selenium import webdriver
import re

url = 'https://bazaartracker.com/search?query=rough+ruby'

def extract_dynamic_numbers_from_url(url):
    driver = webdriver.Chrome()  # 需提前安装ChromeDriver并配置环境变量
    driver.get(url)
    content = driver.page_source  # 获取渲染后的完整HTML
    driver.quit()
    pattern = r'<span[^>]*class="text-subtle-100"[^>]*>([\d.]+)\s*coins</span>'
    dynamic_numbers = re.findall(pattern, content)
    return dynamic_numbers

print(extract_dynamic_numbers_from_url(url))

额外优化:处理带逗号的数字

如果目标数字包含千位分隔符(如1,234 coins),调整正则并清理结果:

pattern = r'<span[^>]*class="text-subtle-100"[^>]*>([\d.,]+)\s*coins</span>'
dynamic_numbers = [num.replace(',', '') for num in re.findall(pattern, content)]

内容的提问来源于stack exchange,提问作者Kubista41

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 05:52:44