Selenium获取页面源码中文解码错误,求正确解码方法
解决Selenium获取页面源码中文解码错误的问题
这个问题我之前也碰到过,主要是因为Selenium返回的page_source可能和浏览器实际渲染的编码处理逻辑不一样,尤其是国内的政府网站(比如你用的统计局数据站)常用GBK/GB2312编码,容易出现解码偏差。给你几个靠谱的解决办法:
方法1:获取浏览器渲染后的HTML(最推荐)
直接通过JavaScript获取页面渲染完成后的完整HTML,这个结果和浏览器显示的内容编码一致,不会出现解码问题:
from selenium import webdriver driver = webdriver.Chrome("/home/ug/Desktop/bin/chromedriver") url = "http://data.stats.gov.cn/easyquery.htm?m=QueryData&dbcode=fsjd&rowcode=zb&colcode=sj&wds=%5B%7B%22wdcode%22%3A%22reg%22%2C%22valuecode%22%3A%22350000%22%7D%5D&dfwds=%5B%5D&k1=1555920886106" driver.get(url) # 执行JS获取渲染后的完整页面HTML page_html = driver.execute_script("return document.documentElement.outerHTML") # 现在打印或处理page_html就能得到正确的中文内容 print(page_html)
原理是:document.documentElement.outerHTML是浏览器已经处理好编码的页面源码,完全对应你在浏览器开发者工具里看到的内容,比driver.page_source更可靠。
方法2:手动修复编码解码流程
如果一定要用driver.page_source,可以先把字符串转回字节(避免丢失原始编码信息),再用正确的编码解码:
from selenium import webdriver driver = webdriver.Chrome("/home/ug/Desktop/bin/chromedriver") url = "http://data.stats.gov.cn/easyquery.htm?m=QueryData&dbcode=fsjd&rowcode=zb&colcode=sj&wds=%5B%7B%22wdcode%22%3A%22reg%22%2C%22valuecode%22%3A%22350000%22%7D%5D&dfwds=%5B%5D&k1=1555920886106" driver.get(url) # 先将page_source转成latin-1字节(单字节编码,不会丢失任何原始数据) source_bytes = driver.page_source.encode('latin-1') # 再用网站实际的编码解码,统计局网站常用GBK/GB2312,也可以试试utf-8 page_html = source_bytes.decode('gbk') print(page_html)
为什么用latin-1?因为driver.page_source返回的字符串如果是被错误解码的,用latin-1转字节可以还原原始的字节流,再用正确的编码解码就能得到正确内容。
额外提示
如果还是有编码问题,可以打开浏览器的开发者工具(F12),查看页面的<meta charset="xxx">标签,里面的编码值就是你需要用的解码编码(比如统计局这个网站大概率是gb2312或gbk)。
内容的提问来源于stack exchange,提问作者vhysug




