Selenium-wire 响应对象 - 将响应主体作为字符串而不是字节获取的方法
Selenium-wire response object - Way to get response body as string rather than bytes
我想在 selenium-wire 中获取一个响应主体作为字符串,我最终会将其解析为 JSON。
selenium-wire 中的 response.body
给出字节字符串。我尝试将其解码为 response.body.decode('utf-8')
但这会导致解码错误。
有人可以帮我解决这个问题吗?
我对两个解决方案都很好:
- 将字节字符串解码为普通字符串的一种方法
- 首先将响应正文作为普通字符串获取的方法
我想出了一个方法来做到这一点(不是一个理想的方法)
在制作 selenium webdriver 对象时,您可以传递一个参数 options
,您可以在其中明确告诉它提供解码的请求和响应对象,而不是字节。
我想分享我的解决方案,它对我有用。
在python >= 3.5.x
from seleniumwire import webdriver
import chromedriver_autoinstaller
import brotli
chromedriver_autoinstaller.install()
driver = webdriver.Chrome()
driver.get('https://www.facebook.com')
for request in driver.requests:
if request.url == "https://www.facebook.com/":
resp = request.response.body
resp = brotli.decompress(resp)
print(resp[0:200].decode("utf-8"))
driver.quit()
默认 selenium-wire returns 正文响应为字节。
文档说:
“作为字节的响应主体。如果响应没有主体,主体的值将为空,即 b''。有时主体可能已被服务器编码 - 例如压缩。您可以防止这种情况发生disable_encoding 选项。要手动解码已编码的响应正文,您可以执行以下操作:
from seleniumwire.utils import decode
body = decode(response.body, response.headers.get('Content-Encoding', 'identity'))"
它对我有用。
放这个:
decode(request.response.body, request.response.headers.get('Content-Encoding', 'identity'))
在你发表声明之前:
response.body.decode('utf-8')
完整代码:
from seleniumwire import webdriver
from seleniumwire.utils import decode as sw_decode
browser = webdriver.Chrome()
browser.get(url)
for request in browser.requests:
if request.url == url:
data = sw_decode(request.response.body, request.response.headers.get('Content-Encoding', 'identity'))
data = data.decode("utf8")
print(type(data))
break
browser.quit()
输出:
<class 'str'>
我想在 selenium-wire 中获取一个响应主体作为字符串,我最终会将其解析为 JSON。
selenium-wire 中的response.body
给出字节字符串。我尝试将其解码为 response.body.decode('utf-8')
但这会导致解码错误。
有人可以帮我解决这个问题吗? 我对两个解决方案都很好:
- 将字节字符串解码为普通字符串的一种方法
- 首先将响应正文作为普通字符串获取的方法
我想出了一个方法来做到这一点(不是一个理想的方法)
在制作 selenium webdriver 对象时,您可以传递一个参数 options
,您可以在其中明确告诉它提供解码的请求和响应对象,而不是字节。
我想分享我的解决方案,它对我有用。
在python >= 3.5.x
from seleniumwire import webdriver
import chromedriver_autoinstaller
import brotli
chromedriver_autoinstaller.install()
driver = webdriver.Chrome()
driver.get('https://www.facebook.com')
for request in driver.requests:
if request.url == "https://www.facebook.com/":
resp = request.response.body
resp = brotli.decompress(resp)
print(resp[0:200].decode("utf-8"))
driver.quit()
默认 selenium-wire returns 正文响应为字节。
文档说:
“作为字节的响应主体。如果响应没有主体,主体的值将为空,即 b''。有时主体可能已被服务器编码 - 例如压缩。您可以防止这种情况发生disable_encoding 选项。要手动解码已编码的响应正文,您可以执行以下操作:
from seleniumwire.utils import decode
body = decode(response.body, response.headers.get('Content-Encoding', 'identity'))"
它对我有用。
放这个:
decode(request.response.body, request.response.headers.get('Content-Encoding', 'identity'))
在你发表声明之前:
response.body.decode('utf-8')
完整代码:
from seleniumwire import webdriver
from seleniumwire.utils import decode as sw_decode
browser = webdriver.Chrome()
browser.get(url)
for request in browser.requests:
if request.url == url:
data = sw_decode(request.response.body, request.response.headers.get('Content-Encoding', 'identity'))
data = data.decode("utf8")
print(type(data))
break
browser.quit()
输出:
<class 'str'>