如何用HTMLParser()提取页面span标签中的价格信息?
使用HTMLParser提取指定span标签的价格
核心思路
HTMLParser是逐段解析HTML内容的,我们需要通过状态标记来跟踪是否进入了目标标签:
- 定义一个类继承自
html.parser.HTMLParser - 初始化一个状态变量(比如
in_price_tag),用来标记当前是否处于目标span标签内 - 重写
handle_starttag方法:检查当前标签是span且包含itemprop="price"属性,满足条件就把状态设为True,还可以直接提取content属性的值 - 重写
handle_data方法:当状态为True时,处理标签内的文本内容 - 重写
handle_endtag方法:遇到span标签时把状态重置为False,避免误匹配后续的span
完整代码示例
from html.parser import HTMLParser class PriceParser(HTMLParser): def __init__(self): super().__init__() self.in_price_tag = False self.prices = [] # 用来存储提取到的价格 def handle_starttag(self, tag, attrs): # 检查当前标签是span,且存在itemprop="price"的属性 if tag == 'span': for attr_name, attr_value in attrs: if attr_name == 'itemprop' and attr_value == 'price': self.in_price_tag = True # 可选:直接提取content属性的值 for name, value in attrs: if name == 'content': self.prices.append(f'content属性值:{value}') break def handle_data(self, data): # 只有处于目标标签内时,才处理文本内容 if self.in_price_tag: # 去除文本前后的空白字符 cleaned_data = data.strip() if cleaned_data: self.prices.append(f'标签文本:{cleaned_data}') def handle_endtag(self, tag): # 离开span标签时,重置状态 if tag == 'span': self.in_price_tag = False # 测试用例 test_html = ''' <div> <span itemprop="price" content="590">590 dollars</span> <span class="normal">普通文本</span> <span itemprop="price" content="1299">1299 USD</span> </div> ''' parser = PriceParser() parser.feed(test_html) parser.close() # 输出提取到的价格 for price in parser.prices: print(price)
代码说明
handle_starttag里的attrs是一个元组列表,每个元素是(属性名, 属性值),遍历它即可判断是否是目标标签- 状态变量
in_price_tag确保只有在目标span内的文本才会被收集 - 既可以提取
content属性的数值,也可以提取标签内的显示文本,根据需求选择即可
内容的提问来源于stack exchange,提问作者Beginner
相关产品推荐
相关产品推荐

