如何在BeautifulSoup中获取带空格的HTML属性?
解决方法
要拿到属性值的原始文本(包括末尾空格),别用默认的解析逻辑——它们都会自动规范化属性值。推荐用lxml库,它能配置解析器保留原始空格,而且处理大文件(11000+行)的性能完全没问题。
具体操作
- 先安装lxml:
pip install lxml
- 创建解析器时开启
preserve_whitespace_in_attr_values选项,这个参数会让解析器不碰属性值里的首尾空格:
from lxml import etree # 读取HTML内容(处理本地文件的话,直接用etree.parse读取) html_content = '''<html lang="en" class="no-js"> <div> <p class="price "> 3.75 </p> <p>21</p> </div> </html>''' # 配置解析器,保留属性原始空格格式 parser = etree.HTMLParser(preserve_whitespace_in_attr_values=True) tree = etree.fromstring(html_content, parser=parser) # 定位到带class属性的目标p标签 target_p = tree.xpath('//p[@class]')[0] # 获取原始class属性值 raw_class = target_p.attrib['class'] print(repr(raw_class)) # 输出结果: 'price '
原理说明
- 不管是BeautifulSoup还是默认配置的lxml,都会自动对属性值做「规范化」处理:去掉首尾空格、合并内部连续空格,这就是你之前拿不到末尾空格的核心原因。
- 开启
preserve_whitespace_in_attr_values后,lxml会严格保留属性值的原始格式,完全符合你的需求。 - lxml是基于C实现的解析库,处理大文件的速度和内存占用都比正则表达式靠谱得多,11000行的HTML文件能轻松应对。
如果是处理本地HTML文件,直接替换成以下代码读取:
tree = etree.parse('your_html_file.html', parser=parser)
内容的提问来源于stack exchange,提问作者mauro maurosayan5 baeza
相关产品推荐
相关产品推荐

