用爬虫抓下来的html源码,一般都有很多 换行符和空格,如果相对这些空字符都去掉,也就是对源码做一个压缩,要怎么做呢?
有人说可以直接用正则去替换
import re
new_txt = re.sub(r">\s+<", "><", text)
但这样假如标签中有文本存在模式类似 ">\s+<" 的文本,原本的结构就被破坏了,因此最好不要用正则直接去修改 html 源码,很容易造成误差
逛了一圈 stockflow,我找到一个方案,使用 lxml.etree遍历每个标签节点,对其中的 tail和text 做一个 strip操作,如下:
from lxml import etree
def remove_tag_space(html_text):
tree = etree.HTML(html_text)
for tag in tree.iter():
if tag.tail:
tag.tail = tag.tail.strip()
if tag.text:
tag.text = tag.text.strip()
return etree.tostring(tree, encoding="unicode")
效果如下:
注意一点,这方法如果是 <br>、<hr>、<img>、<input>、<param>、<meta>、<link> 等单标签,可能还是会修改原文本,我的做法是做一个白名单列表,如果是单标签就跳过,如果你有更好的做法,欢迎在评论区留言,共同探讨