【问题标题】:WebDriverException: Message: unknown error: bad inspector message error while printing HTML content using ChromeDriver Chrome through Selenium PythonWebDriverException:消息:未知错误:使用 ChromeDriver Chrome 通过 Selenium Python 打印 HTML 内容时出现错误检查器消息错误
【发布时间】:2019-07-04 03:07:42
【问题描述】:

我正在抓取一些 HTML 内容..

for i, c in enumerate(cards[75:77]):
    print(i)
    a = c.find_element_by_class_name("influencer-stagename")
    print(a.get_attribute('innerHTML'))

适用于除第 76 条以外的所有记录。错误前的输出...

0
b'<a class="influencer-analytics-link" href="/influencers/sophiewilling"><h5><span>SOPHIE WILLING</span></h5></a>'
1
b'<a class="influencer-analytics-link" href="/influencers/ferntaylorr"><h5><span>Fern Taylor.</span></h5></a>'
2
b'<a class="influencer-analytics-link" href="/influencers/officialshaniceslatter"><h5><span>Shanice Slatter</span></h5></a>'
3

堆栈跟踪...

> -------------------------------------------------------------------------
WebDriverException                        Traceback (most recent call last) <ipython-input-484-0a80d1af1568> in <module>
          3     #print(c.find_element_by_class_name("influencer-stagename").text)
          4     a = c.find_element_by_class_name("influencer-stagename")
    ----> 5     print(a.get_attribute('innerHTML').encode('ascii', 'ignore'))

    ~/anaconda3/envs/py3-env/lib/python3.7/site-packages/selenium/webdriver/remote/webelement.py in get_attribute(self, name)
        141                 self, name)
        142         else:
    --> 143             resp = self._execute(Command.GET_ELEMENT_ATTRIBUTE, {'name': name})
        144             attributeValue = resp.get('value')
        145             if attributeValue is not None:

    ~/anaconda3/envs/py3-env/lib/python3.7/site-packages/selenium/webdriver/remote/webelement.py in _execute(self, command, params)
        631             params = {}
        632         params['id'] = self._id
    --> 633         return self._parent.execute(command, params)
        634 
        635     def find_element(self, by=By.ID, value=None):

    ~/anaconda3/envs/py3-env/lib/python3.7/site-packages/selenium/webdriver/remote/webdriver.py in execute(self, driver_command, params)
        319         response = self.command_executor.execute(driver_command, params)
        320         if response:
    --> 321             self.error_handler.check_response(response)
        322             response['value'] = self._unwrap_value(
        323                 response.get('value', None))

    ~/anaconda3/envs/py3-env/lib/python3.7/site-packages/selenium/webdriver/remote/errorhandler.py in check_response(self, response)
        240                 alert_text = value['alert'].get('text')
        241             raise exception_class(message, screen, stacktrace, alert_text)
    --> 242         raise exception_class(message, screen, stacktrace)
        243 
        244     def _value_or_default(self, obj, key, default):

    WebDriverException: Message: unknown error: bad inspector message: {"id":110297,"result":{"result":{"type":"object","value":{"status":0,"value":"<a class=\"influencer-analytics-link\" href=\"/influencers/bookishemily\"><h5><span>Emily | 18 | GB | Student\uD83C...</span></h5></a>"}}}}   (Session info: chrome=75.0.3770.100)   (Driver info: chromedriver=2.40.565386 (45a059dc425e08165f9a10324bd1380cc13ca363),platform=Mac OS X 10.14.0 x86_64)

我怀疑这是一个无效字符

值":"艾米丽 | 18 |国标 |学生\uD83C..."

我特别怀疑“\uD83C”

添加

.encode("utf-8")  OR   .encode('ascii', 'ignore')

到第二个打印语句没有任何改变。

关于如何解决这个问题的任何想法?

更新:问题在于表情符号字符。到目前为止,我已经找到了 3 个示例,每个示例都有一个表情符号(粉红色的花????,俄罗斯国旗???????? 和旋转的叶子????)。如果我使用 Chrome 检查器将它们编辑出来,我的代码运行良好,但这不是一个可大规模使用的解决方案

【问题讨论】:

  • 您能否提供您尝试抓取的网址以模仿您的错误。或者只是包含问题区域的示例 HTML。
  • 我不能这是一项付费服务​​。对不起。
  • 好吧试试这个:print(a.get_attribute('innerHTML').encode('ascii', 'ignore').decode('ascii')
  • 这也不起作用。 :-(

标签: python-3.x selenium google-chrome web-scraping selenium-chromedriver


【解决方案1】:

此错误消息...

WebDriverException: Message: unknown error: bad inspector message: {"id":110297,"result":{"result":{"type":"object","value":{"status":0,"value":"<a class=\"influencer-analytics-link\" href=\"/influencers/bookishemily\"><h5><span>Emily | 18 | GB | Student\uD83C...</span></h5></a>"}}}}   (Session info: chrome=75.0.3770.100)   (Driver info: chromedriver=2.40.565386 (45a059dc425e08165f9a10324bd1380cc13ca363),platform=Mac OS X 10.14.0 x86_64)

...暗示 ChromeDriver 由于 JSON 编码/解码问题而无法解析某些非 UTF-8 字符。


深入研究

根据Issue 723592: 'Bad inspector message' errors when running URL web-platform-tests via webdriver John Chen(所有者 - Google Chrome 的 WebDriver)在他的comment 中的讨论提到:

JSON 编码/解码问题导致https://travis-ci.org/w3c/web-platform-tests/jobs/232845351 报告“错误的检查器消息”错误。第 1 部分的部分错误消息包含无效的 Unicode 字符 \uFDD0(来自 https://github.com/w3c/web-platform-tests/blob/34435a4/url/urltestdata.json#L3596)。 Chrome 内部的 JSON 编码器没有检测到此类错误,并在发送到 ChromeDriver 的 JSON blob 中将其传递。 ChromeDriver 使用 base/json/json_parser.cc 来解析 JSON 字符串。此解析器进行更彻底的错误检测,注意到 \uFDD0 是无效字符,并报告错误。我认为我们的 JSON 编码器和解码器应该具有完全相同的错误检查量。编码器可以创建一个被解码器拒绝的 blob,这是有问题的。


分析

John Chen(所有者 - Google Chrome 的 WebDriver)进一步added

JSON 编码发生在 DevTools 的协议布局中,就在结果发送回 ChromeDriver 之前。相关代码在https://cs.chromium.org/chromium/src/out/Debug/gen/v8/src/inspector/protocol/Protocol.cpp。特别是,escapeStringForJSON 函数负责对字符串进行编码。其实挺保守的。任何高于 126 的内容都以 \uXXXX 格式编码。 (注意Protocol.cpp是一个生成的文件,真正的来源是https://cs.chromium.org/chromium/src/v8/third_party/inspector_protocol/lib/Values_cpp.template。)

ChromeDriver 使用的 JSON 解析器出现错误。 \uXXXX 序列的解码发生在https://cs.chromium.org/chromium/src/base/json/json_parser.cc?l=564https://cs.chromium.org/chromium/src/base/json/json_parser.cc?l=670。解码转义序列后,解码器会拒绝任何不是有效 Unicode 字符的内容。

我注意到最近发生了一项更改,以防止 JSON 编码器发出无效的 Unicode 代码点:https://crrev.com/478900。不幸的是,该错误所涉及的代码不是使用 JSON 编码器,因此它不能直接帮助我们,但这表明我们并不是唯一受此类问题影响的人。


解决方案

此问题已通过revision 在 chromedriver 中解码无效 UTF 字符串时替换无效 UTF-16 转义序列得到解决,因为 Web 平台测试可能使用不一定是 utf-16 字符的 ECMAScript 字符串 /commit.

因此,一个快速的解决方案是确保以下内容并重新执行您的测试:


另类

作为替代方案,您可以使用 GeckoDriver / Firefox 组合,您可以在 Chromedriver only supports characters in the BMP error while sending Emoji with ChromeDriver Chrome using Selenium Python to Tkinter's label() textbox

找到相关讨论

【讨论】:

  • 您提出的解决方案不适用于 python-selenium,可能是因为最新的可用版本是 3.141.0。您提供的使用 geckodriver 切换到 Firefox 的替代方法效果很好。它确实需要根据stackoverflow.com/questions/50414007/… 重写基于 chrome 的 python 代码
猜你喜欢
  • 2018-10-31
  • 1970-01-01
  • 2020-05-21
  • 2019-10-22
  • 2017-06-17
  • 1970-01-01
  • 2021-05-22
  • 1970-01-01
  • 2020-11-01
相关资源
最近更新 更多