1. Python作业3:HTML字符转义与解析实战
刚接触Python处理HTML内容时,最让人头疼的就是特殊字符的处理。记得我第一次做爬虫项目,就因为没处理好<这类转义字符,导致数据库存了一堆乱码。这个作业虽然标题简单,但涉及到的html模块却是Web开发中必备的利器。
2. HTML转义原理深度解析
2.1 为什么需要字符转义
HTML中<、>、&等字符具有特殊含义。比如直接在页面显示x < y,浏览器会误认为<y是未闭合的标签。通过html.escape()转换后,x < y就能正确显示为x < y。
2.2 安全转义实战
python复制import html
raw_text = '<script>alert("XSS")</script>'
safe_text = html.escape(raw_text)
# 输出: <script>alert("XSS")</script>
关键参数说明:
quote=True时会将引号一起转义,适合用在HTML属性值中。如果是普通文本内容,可以设为False。
3. 逆向操作:HTML实体解码
3.1 解码应用场景
从网页抓取内容时,经常会遇到&这类编码。使用html.unescape()可以还原:
python复制encoded = "<div>"
decoded = html.unescape(encoded) # 输出: <div>
3.2 进阶解码技巧
该函数支持所有HTML5标准实体:
- 命名实体(
) - 十进制编码(
 ) - 十六进制编码(
 )
4. 常见问题解决方案
4.1 转义过度问题
多次调用escape()会导致&lt;这样的多层转义。解决方法:
python复制def safe_escape(text):
return html.escape(html.unescape(text))
4.2 性能优化
处理大量文本时,可以预编译正则表达式:
python复制from html.parser import HTMLParser
class MyParser(HTMLParser):
def handle_data(self, data):
print("获取到:", data)
parser = MyParser()
parser.feed("<p>解析<b>示例</b></p>")
5. 实战项目:简易HTML净化器
结合所学知识,我们可以实现一个安全的HTML过滤器:
python复制def sanitize_html(html_str):
from html.parser import HTMLParser
from html import escape
class Sanitizer(HTMLParser):
allowed_tags = {'p', 'b', 'i'}
def handle_starttag(self, tag, attrs):
if tag in self.allowed_tags:
print(f"<{tag}>", end="")
def handle_data(self, data):
print(escape(data), end="")
def handle_endtag(self, tag):
if tag in self.allowed_tags:
print(f"</{tag}>", end="")
sanitizer = Sanitizer()
sanitizer.feed(html_str)
这个作业虽然基础,但掌握了这些技能后,你能轻松应对:
- 防止XSS攻击
- 正确处理用户输入
- 实现安全的富文本存储
- 开发网页内容抓取工具
