使用Beautiful Soup爬取网页时,如何更优处理页面变体提取MRP?
优化MRP爬取的高效方案
你现在靠硬编码标签class的方式,确实会因为页面结构变动频繁失效。既然所有页面的MRP都统一以MRP: 数值这类格式呈现,完全可以基于文本内容而非标签结构来提取,这是更稳定灵活的方案。
方法1:BeautifulSoup文本搜索+正则匹配
利用BeautifulSoup定位包含MRP关键词的文本节点,再用正则提取数值:
import re from bs4 import BeautifulSoup def get_MRP(soup): # 搜索所有包含MRP的文本(忽略大小写) mrp_nodes = soup.find_all(text=re.compile(r'MRP:', re.IGNORECASE)) if mrp_nodes: # 取第一个匹配的文本,清理空格后提取数值 clean_text = mrp_nodes[0].strip() # 匹配整数或小数格式的数值 num_match = re.search(r'\d+\.?\d*', clean_text) if num_match: return num_match.group() return ""
这个方法不绑定任何标签class,只要页面里有MRP的文本标识就能提取,能兼容各种页面结构变体,还能处理大小写、多余空格的情况。
方法2:直接匹配页面全局文本
如果不需要精准定位节点,也可以直接抓取页面所有文本后做正则匹配,写法更简洁:
import re from bs4 import BeautifulSoup def get_MRP(soup): full_text = soup.get_text() # 匹配MRP: 后紧跟的数值,忽略中间空格和大小写 result = re.search(r'MRP:\s*(\d+\.?\d*)', full_text, re.IGNORECASE) return result.group(1) if result else ""
这种方式完全脱离标签结构的限制,容错性拉满,只要页面文本里有符合格式的MRP就不会漏。
额外适配技巧
- 如果MRP带货币符号(比如
MRP: ₹100),可以把正则改成r'MRP:\s*[^\d]*(\d+\.?\d*)',自动过滤掉符号。 - 要是怕误匹配类似“SMRP:”的文本,给MRP加单词边界:
r'\bMRP:\b\s*(\d+\.?\d*)'。
内容的提问来源于stack exchange,提问作者Vedanta Mohapatra
相关产品推荐
相关产品推荐

