Python版本信息爬取异常:返回值全为‘8’的问题求解
问题:爬取网页版本信息异常,所有行返回“8”
脚本功能与问题现状
- 访问Excel文件中的URL
- 提取网页上的版本信息
- 将提取的版本与Excel记录的版本对比,生成新增
latest version列的新文件:版本一致返回Same,否则返回提取到的版本 - 异常:所有行的
latest version列均返回“8”
现有函数代码
import requests from bs4 import BeautifulSoup def extract_version(url, current_version): # Make HTTP request to URL response = requests.get(url) # Parse HTML content of webpage soup = BeautifulSoup(response.content, 'html.parser') # Extract version information using regular expressions version_pattern = re.compile(r'\d+(?:\.\d+)*[a-zA-Z]*') match = version_pattern.search(str(soup)) if match: extracted_version = match.group() if str(extracted_version) == str(current_version): return 'Same' else: return extracted_version else: return ''
Excel示例数据
modyolo.com/lords-mobile.html, 2.97 apkmody.io/games/zombie-frontier-3-mod-apk, 2.52 modyolo.com/car-mechanic-simulator-21.html, 2.1.63 modyolo.com/roblox-2.html, 2.564.424c
已尝试的操作
- 将正则中的
\d替换为[0-9] - 将
+替换为{1,} - 在正则开头添加
^
解决方案
问题根源分析
- 缺失模块导入:代码中使用了
re模块但未导入,会导致运行错误(实际运行的代码可能补了导入,但核心问题是正则匹配范围太广) - 全局正则匹配无针对性:直接搜索整个网页的字符串,会匹配到网页中任意位置的孤立数字(比如“8”可能是页码、统计数等,并非目标版本)
- 未适配不同网站的版本位置:不同网站的版本信息存放在特定标签中,全局匹配无法精准定位
修正后的代码
import requests from bs4 import BeautifulSoup import re # 补充缺失的模块导入 def extract_version(url, current_version): try: # 添加请求头,避免被网站识别为爬虫拦截 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 = requests.get(url, headers=headers) response.raise_for_status() # 捕获HTTP请求错误 soup = BeautifulSoup(response.content, 'html.parser') extracted_version = "" # 根据域名针对性定位版本元素 if "modyolo.com" in url: # 匹配modyolo网站的版本标签(通常带version类的div) version_elem = soup.find("div", class_="version") if version_elem: extracted_version = version_elem.get_text(strip=True).replace("Version: ", "") elif "apkmody.io" in url: # 匹配apkmody网站的版本信息(info-box中的版本项) version_label = soup.find("span", string=re.compile("Version")) if version_label: extracted_version = version_label.find_next_sibling("span").get_text(strip=True) # 元素定位失败时,用正则兜底并筛选有效结果 if not extracted_version: # 添加边界符\b,避免匹配数字片段;筛选排除单个数字(如"8") version_pattern = re.compile(r'\b\d+(?:\.\d+)*[a-zA-Z]*\b') matches = version_pattern.findall(str(soup)) for match in matches: if len(match) > 1 or (len(match) == 1 and match in current_version): extracted_version = match break # 对比版本并返回结果 if extracted_version: return 'Same' if str(extracted_version) == str(current_version) else extracted_version else: return '' except Exception as e: print(f"处理URL {url} 出错: {str(e)}") return ''
关键优化点
- 添加请求头:模拟浏览器请求,避免被网站拦截
- 分域名定位元素:针对不同网站的版本存放位置精准提取,比全局正则更可靠
- 正则优化:添加边界符避免匹配数字片段,筛选排除无意义的单个数字
- 异常处理:捕获请求错误、元素查找错误,避免脚本崩溃
内容的提问来源于stack exchange,提问作者No One
相关产品推荐
相关产品推荐

