使用urllib3+正则提取网页数字失败,仅输出空列表求助
问题诊断与解决方案
1. 正则表达式错误:转义字符使用不当
你的正则里用了<和",但实际网页内容解码后是原始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
相关产品推荐
相关产品推荐

