基于urllib的阿拉伯语网站爬取:<font>标签解析异常问题
解决自定义HTML解析器无法提取标签内容的问题
核心问题分析
你的解析器仅针对<p>标签做了内容提取逻辑,未处理嵌套<font>标签或直接用<font>包裹内容的场景,再加上阿拉伯语网站可能存在的编码差异,最终导致内容提取失败。
具体修复方案
1. 扩展标签匹配规则
修改解析器的标签处理逻辑,同时监听<p>和<font>标签的开始与结束状态,记录当前是否处于目标标签内,无论标签是否嵌套都能捕获内容。
2. 适配阿拉伯语编码
阿拉伯语网站常用编码为Windows-1256或UTF-8,使用urllib获取响应后,先确认编码再解码,避免乱码导致的解析异常。
修改后的代码示例
from urllib.request import urlopen class CustomHTMLParser: def __init__(self): self.in_target_tag = False self.content = [] def feed(self, html): i = 0 len_html = len(html) while i < len_html: # 匹配<p>或<font>开始标签 if html.startswith('<p', i) or html.startswith('<font', i): end_tag = html.find('>', i) if end_tag != -1: self.in_target_tag = True i = end_tag + 1 else: i += 1 # 匹配</p>或</font>结束标签 elif html.startswith('</p>', i) or html.startswith('</font>', i): self.in_target_tag = False tag_len = len('</p>') if html.startswith('</p>', i) else len('</font>') i += tag_len # 处于目标标签内时收集文本 elif self.in_target_tag: next_tag = html.find('<', i) if next_tag != -1: self.content.append(html[i:next_tag].strip()) i = next_tag else: self.content.append(html[i:].strip()) break else: i += 1 def get_content(self): return ' '.join([text for text in self.content if text]) # 爬取解析流程 url = "你的目标URL" response = urlopen(url) html_bytes = response.read() # 兼容阿拉伯语编码 try: html = html_bytes.decode('utf-8') except UnicodeDecodeError: html = html_bytes.decode('windows-1256') parser = CustomHTMLParser() parser.feed(html) print(parser.get_content())
说明
- 解析器同时支持
<p>和<font>标签,不管是<p>嵌套<font>还是单独的<font>标签,都能提取其中的文本内容。 - 编码处理部分做了兼容,解决阿拉伯语网站常见的编码混乱问题。
- 全程使用原生
urllib实现,未引入第三方解析库,符合你的需求。
内容的提问来源于stack exchange,提问作者Zeid Tisnes
相关产品推荐
相关产品推荐

