【问题标题】:invalid start byte while decoding url to utf-8-sig将 url 解码为 utf-8-sig 时起始字节无效
【发布时间】:2017-05-30 21:03:04
【问题描述】:

以下是代码:

for page in forumPages:
    try:
        req = Request(page, headers={'User-Agent': 'Mozilla/5.0'})
        sock = urlopen(req).read().decode("utf-8-sig")
        soup = BeautifulSoup(sock, 'html.parser')
        pageThreads = soup.findAll('ol',{"class":"threads"})
        print(len(pageThreads))

    except Exception as ex:
        pass

我收到错误消息 invalid start byte

如何解决异常,以便我可以有有效的文本来应用 SOUP。

执行urlopen(req).read() 会得到\xef\xbb\xbf<!DOCTYPE html PUBLIC ...

我正在尝试的页面是https://www.siasat.pk/forum/forumdisplay.php?22-Siasi-Discussion/page1

我尝试过申请thissock = urlopen(req).read().decode("utf-8-sig").encode("utf-8") 但异常是一样的

【问题讨论】:

  • 我尝试应用解决方案,但异常是一样的
  • 您遇到异常的无效起始字节在哪里?问题似乎不在代码的开头;但后来它可能不是有效的 utf-8。
  • 166300 左右的文本中有一些有趣的开引号。试试urlopen(req).read().decode("utf-8-sig","ignore")
  • @alexis 解决方案有效

标签: python web-scraping


【解决方案1】:

您显示的文件的开头似乎是 UTF-8 版本的 unicode 字节顺序标记,因此您的解码方法是正确的。显然,文件的其余部分在某处包含无效的 utf-8。由于您不控制正在抓取的输入的质量,因此您可以像这样抑制错误,以便继续:

text = urlopen(req).read().decode("utf-8-sig", errors="replace")

这会将问题区域替换为特殊符号,以便您查看问题所在。或者使用errors="ignore" 让它们消失。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-29
    • 2018-02-10
    • 2020-09-22
    • 2018-06-12
    • 2021-12-01
    • 2020-06-22
    • 2016-05-13
    • 2017-05-03
    相关资源
    最近更新 更多