Closed zyoung1212 closed 4 months ago
目前我的解决办法是,先用requests的编码检测,但这样请求了两次:
@app.post("/fetch_html", response_class=HTMLResponse)
def fetch_html(request: UrlRequest):
try:
request_res = requests.get(request.url, proxies={"http": request.proxy})
new_encoding = request_res.apparent_encoding
response = cffi_requests.get(str(request.url), proxy=request.proxy, impersonate="chrome120")
# 检查响应状态码
if response.status_code != 200:
raise HTTPException(status_code=response.status_code, detail="Failed to fetch the URL")
response.encoding = new_encoding
# 返回HTML内容
return HTMLResponse(content=response.text, status_code=200)
except Exception as e:
raise HTTPException(status_code=500, detail=f"An error occurred: {str(e)}")
能否将requests的apparent_encoding移过来呢
requests
用了 chardet
这个库来自动检测编码,但是根据我以前的经验,这个库有时候会 hang 住,特别慢。你也可以用更快一点的 cchardet
,但是这个库好像不支持 3.10+。这俩依赖我都不倾向于加。
>>> from curl_cffi import requests
>>> r = requests.get("https://news.c<DELETEME>readers.net/china/2024/06/19/2743922.html")
>>> import chardet
>>> chardet.detect(r.content)
{'encoding': 'GB2312', 'confidence': 0.99, 'language': 'Chinese'}
就你这个网站而言,他的编码信息放在了 html head 里,倒是可以考虑加上这个检测。
<meta http-equiv="Content-Type" content="text/html; charset=gbk" />
PS,你这搞得网站很危险啊,墙内的话,注意自己安全。
requests
用了chardet
这个库来自动检测编码,但是根据我以前的经验,这个库有时候会 hang 住,特别慢。你也可以用更快一点的cchardet
,但是这个库好像不支持 3.10+。这俩依赖我都不倾向于加。>>> from curl_cffi import requests >>> r = requests.get("https://news.c<DELETEME>readers.net/china/2024/06/19/2743922.html") >>> import chardet >>> chardet.detect(r.content) {'encoding': 'GB2312', 'confidence': 0.99, 'language': 'Chinese'}
就你这个网站而言,他的编码信息放在了 html head 里,倒是可以考虑加上这个检测。
<meta http-equiv="Content-Type" content="text/html; charset=gbk" />
PS,你这搞得网站很危险啊,墙内的话,注意自己安全。
非常感谢!经提醒,已删除相关链接
cchardet
meta标签的我记得很久前遇到过一个中文网站,它meta里面是gbk,但实际需要utf-8才正确。具体哪个忘记了。所以暂时没考虑。
meta标签的我记得很久前遇到过一个中文网站,它meta里面是gbk,但实际需要utf-8才正确。具体哪个忘记了。所以暂时没考虑。
那就是网站的问题了,这不是开左灯往右转么。
请问中文网站乱码,有什么通用的解决办法吗?(即不通过手动指定编码) Can you tell me if there is any general solution for Chinese websites with messy codes? (i.e. not by specifying the encoding manually)