微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Requests-html 导致 OSError: [Errno 8] 调用 html.render() 时执行格式错误

如何解决Requests-html 导致 OSError: [Errno 8] 调用 html.render() 时执行格式错误

我正在使用 requests-html 并尝试渲染功能,但收效甚微。当我使用 python3.8 运行这个脚本

#!/usr/bin/python3
from requests_html import HTML
file = "scrape/temp_file2.html"
with open(file) as html_file:
   source = html_file.read()
   html = HTML(html=source)
   html.render()
   match = html.find('#footer',first=True)
   try:
      print(match.hmtl)
   except:
      print('not found')

它导致回溯:

python3 scrape/test1.py
Traceback (most recent call last):
  File "scrape/test1.py",line 10,in <module>
    html.render()
  File "/home/pi/.local/lib/python3.8/site-packages/requests_html.py",line 586,in render
    self.browser = self.session.browser  # Automatically create a event loop and browser
  File "/home/pi/.local/lib/python3.8/site-packages/requests_html.py",line 730,in browser
    self._browser = self.loop.run_until_complete(super().browser)
  File "/usr/local/lib/python3.8/asyncio/base_events.py",line 616,in run_until_complete
    return future.result()
  File "/home/pi/.local/lib/python3.8/site-packages/requests_html.py",line 714,in browser
    self._browser = await pyppeteer.launch(ignoreHTTPSErrors=not(self.verify),headless=True,args=self.__browser_args)
  File "/home/pi/.local/lib/python3.8/site-packages/pyppeteer/launcher.py",line 306,in launch
    return await Launcher(options,**kwargs).launch()
  File "/home/pi/.local/lib/python3.8/site-packages/pyppeteer/launcher.py",line 147,in launch
    self.proc = subprocess.Popen(  # type: ignore
  File "/usr/local/lib/python3.8/subprocess.py",line 854,in __init__
    self._execute_child(args,executable,preexec_fn,close_fds,File "/usr/local/lib/python3.8/subprocess.py",line 1702,in _execute_child
    raise child_exception_type(errno_num,err_msg,err_filename)
OSError: [Errno 8] Exec format error: '/home/pi/.local/share/pyppeteer/local-chromium/588429/chrome-linux/chrome'

chromium 文件一个可执行文件

ls -l /home/pi/.local/share/pyppeteer/local-chromium/588429/chrome-linux/chrome
-rwxr-xr-x 1 pi pi 214121928 Mar  9 17:21 /home/pi/.local/share/pyppeteer/local-chromium/588429/chrome-linux/chrome

如果我删除 html.render() 行,它可以正常工作(但不会呈现 javascript)。 有什么想法吗?

解决方法

经过大量搜索,我找到了解决方案。问题是 pyppeteer 在 32 位 ARM 处理器上安装了 x86-64 版本的 Chromium。下面的解决方案是从 Ubuntu 安装 Chromium 文件并从 pyppeteer 目录链接到这些文件。来自https://github.com/miyakogi/pyppeteer/issues/250

install chromium-codecs-ffmpeg:
   https://launchpad.net/ubuntu/trusty/armhf/chromium-codecs-ffmpeg
   ➜ chromium-codecs-ffmpeg_65.0.3325.181-0ubuntu0.14.04.1_armhf.deb
   sudo dpkg --force-all -i chromium-codecs-ffmpeg_65.0.3325.181-0ubuntu0.14.04.1_armhf.deb

install chromium-browser:
   https://launchpad.net/ubuntu/trusty/armhf/chromium-browser
   ➜ chromium-browser_65.0.3325.181-0ubuntu0.14.04.1_armhf.deb
   sudo dpkg --force-all -i chromium-browser_65.0.3325.181-0ubuntu0.14.04.1_armhf.deb

其他注意事项:

  • 确保您下载的是 >= 62 的版本。我使用的是 65 版,并且运行良好。
  • 先安装chromium-codecs-ffmpeg,然后使用命令安装chromium-browser “dpkg --force-all -i”。
  • 从 Ubuntu 包安装 Chromium 后,通过运行“whereis Chromium-browser”获取其路径
  • 很有可能,它会在“/usr/bin/chromium-browser”上。
  • 转到 pyppeteer 在其上下载 x86 Chromium 的目录。
  • 就您而言,它是“/home/pi/.local/share/pyppeteer/local-chromium/588429/chrome-linux/”。
  • 删除其所有文件。
  • 在同一目录中。创建一个名为“chrome”并指向 Ubuntu 的 Chromium 的符号链接(您已在第 3 步中获得其路径)。
  • 例如:ln -s /usr/bin/chromium-browser chrome
  • 执行这些步骤后,一切都应该正常了。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。