【问题标题】:pyCurl and BytesIO for scraping a website用于抓取网站的 pyCurl 和 BytesIO
【发布时间】:2020-12-31 18:39:14
【问题描述】:

我需要刮。具体来说,我使用 Pycurl 和 BytesIO。

以下代码:

c = pycurl.Curl()
page = BytesIO()
c.setopt(c.INTERFACE, "tun0")
c.setopt(c.USERAGENT, userAgent)
c.setopt(pycurl.CAINFO, certifi.where())
c.setopt(c.URL, URL)
c.setopt(c.WRITEDATA, page)
c.perform()

直到昨天,page.getvalue() 会返回页面的 html,然后我会将其传递给 bs4。然而,今天,我注意到它返回了一个字节字符串,我什至无法将其解码为 utf-8,因为它返回了一个错误:

UnicodeDecodeError: 'utf-8' codec can't decode byte 0x8b in position 1: invalid start byte

如何在字符串中输入 url 的内容,以便将其传递给 bs4 并抓取?

【问题讨论】:

  • 发布前 200 个字节左右,也许我们可以猜出正确的编码。 pycurl 是否以任何方式公开响应标头?也许响应中包含“内容编码”。
  • 在不解码的情况下显示它——看看你在这个字符串中得到了什么。也许它使用不同的编码然后utf-8。或者它可能发送字节文件而不是文本/HTML 文件。
  • 顺便说一句:bs4 可以获取字节 - 你不必解码它。

标签: python pycurl bytesio


【解决方案1】:

您检索到的数据不是有效的 UTF-8,因此无法自动解码。

  • 使用响应返回的标头来确定正文应该采用什么编码。如果编码不是 UTF-8,则使用正确的解码进行解码。
  • 如果声明正文采用 UTF-8 格式但包含无效数据,请使用 bytes.decode 的第二个参数指定如何处理无效数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-23
    相关资源
    最近更新 更多