青出于蓝 发表于 2023-6-27 18:19:41

selenium获取源码是乱码

代码如下:from selenium import webdriver

driver = webdriver.Chrome()
driver.get('https://ai.hxkj.vip/')

html_source = driver.page_source

print(html_source)
driver.quit()


selenium相对于requests的优点之一是不会出现乱码,但这到底是什么情况{:10_266:}

问过chatgpt,各种办法都没用

isdkz 发表于 2023-6-27 18:40:42

没有乱码呀

青出于蓝 发表于 2023-6-27 19:00:00

isdkz 发表于 2023-6-27 18:40
没有乱码呀

我把源码保存成html文件是这样子:
https://xxx.ilovefishc.com/album/202306/27/185857yctmrm18kwdt77xm.png
你可以把这个与开发者工具里看到的源码对比,差别很大
求教

isdkz 发表于 2023-6-27 19:07:56

青出于蓝 发表于 2023-6-27 19:00
我把源码保存成html文件是这样子:

你可以把这个与开发者工具里看到的源码对比,差别很大


你是怎么保存的?

青出于蓝 发表于 2023-6-27 19:31:11

isdkz 发表于 2023-6-27 19:07
你是怎么保存的?

with open(1.html,’w’) as a:
    a.write……

歌者文明清理员 发表于 2023-6-27 19:42:17

青出于蓝 发表于 2023-6-27 19:31
with open(1.html,’w’) as a:
    a.write……

with open("1.html", 'w', encoding='utf-8') as f:
    f.write(

isdkz 发表于 2023-6-27 19:43:51

本帖最后由 isdkz 于 2023-6-27 19:55 编辑

青出于蓝 发表于 2023-6-27 19:31
with open(1.html,’w’) as a:
    a.write……

因为这个网站的代码在元数据那里指定的编码为 utf-8,所以浏览器会以 utf-8 编码来解码,但是你在windows中写入文件不加编码的时候默认是 gbk 编码,因为编码不一致所以导致了乱码



你可以先从元数据中获取编码再以指定编码写入文件:

import re

from selenium import webdriver

driver = webdriver.Chrome()
driver.get('https://ai.hxkj.vip/')

html_source = driver.page_source

pattern = '<meta charset="(.*?)">'
result = re.search(pattern, html_source)
encoding = result.group(1) if result else result

with open('1.html', 'w', encoding=encoding) as a:
        a.write(html_source)
driver.quit()

cflying 发表于 2023-6-28 09:12:44

乱码无非就是编码问题

歌者文明清理员 发表于 2023-7-6 23:16:23

好了吗,只求https://i.imgtg.com/2023/06/18/OTpTnF.png{:10_254:}

青出于蓝 发表于 2024-5-5 10:01:25

@FishC
import requests,json
headers = {
      'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36'}
url='http://www.6002255.com/'
data={
        "input": '最后一页',#input('歌曲名:'),
        "filter": "name",
        "type": "lizhi",
        "page": "1"
}
response=json.loads(requests.post(url,headers=headers,data=data))
print(response)




Traceback (most recent call last):
File "C:\Users\shuoguo-win10\Desktop\333.py", line 11, in <module>
    response=json.loads(requests.post(url,headers=headers,data=data))
File "C:\Users\shuoguo-win10\AppData\Local\Programs\Python\Python39\lib\json\__init__.py", line 339, in loads
    raise TypeError(f'the JSON object must be str, bytes or bytearray, '
TypeError: the JSON object must be str, bytes or bytearray, not Response

FishC 发表于 2024-5-5 10:01:37

青出于蓝 发表于 2024-05-05 10:01
@FishC
import requests,json
headers = {
      ...

你的代码出错的原因是`requests.post()`返回的是一个`Response`对象,而`json.loads()`方法要求传入的参数是一个字符串、字节或字节数组类型的JSON对象。你需要将`Response`对象转换成字符串,然后再解析成JSON对象。

以下是修正后的代码:

import requests
import json

headers = {
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36'
}

url = 'http://www.6002255.com/'

data = {
    "input": '最后一页',# input('歌曲名:'),
    "filter": "name",
    "type": "lizhi",
    "page": "1"
}

response = requests.post(url, headers=headers, data=data)
response_text = response.text
response_json = json.loads(response_text)

print(response_json)

这样就能够正常解析JSON对象了。注意,如果返回的是字节类型的内容,则需要使用`response.content`进行解析。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

青出于蓝 发表于 2024-5-5 10:02:39

FishC 发表于 2024-5-5 10:01
你的代码出错的原因是`requests.post()`返回的是一个`Response`对象,而`json.loads()`方法要求传入的 ...

Traceback (most recent call last):
File "C:\Users\shuoguo-win10\Desktop\333.py", line 19, in <module>
    response_json = json.loads(response_text)
File "C:\Users\shuoguo-win10\AppData\Local\Programs\Python\Python39\lib\json\__init__.py", line 346, in loads
    return _default_decoder.decode(s)
File "C:\Users\shuoguo-win10\AppData\Local\Programs\Python\Python39\lib\json\decoder.py", line 337, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "C:\Users\shuoguo-win10\AppData\Local\Programs\Python\Python39\lib\json\decoder.py", line 355, in raw_decode
    raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

FishC 发表于 2024-5-5 10:02:53

青出于蓝 发表于 2024-05-05 10:02
Traceback (most recent call last):
File "C:\Use ...

这个错误通常是由于返回的内容不是有效的JSON导致的。可以尝试检查一下返回的内容是否包含有效的JSON数据。

你可以使用以下代码进行调试,输出返回的文本内容,查看其中是否包含JSON数据:

import requests

headers = {
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36'
}

url = 'http://www.6002255.com/'

data = {
    "input": '最后一页',
    "filter": "name",
    "type": "lizhi",
    "page": "1"
}

response = requests.post(url, headers=headers, data=data)
response_text = response.text

print(response_text)

请确保这个文本内容是JSON格式的数据,否则如果返回的不是有效的JSON,你需要检查请求参数、请求头、URL等是否正确,并根据具体的接口文档来进行调整和处理。

希望这个能够帮到你!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: selenium获取源码是乱码