【问题标题】:Warning: Some characters could not be decoded, and were replaced by REPLACEMENT CHARACTER警告:某些字符无法解码,并被替换为 REPLACEMENT CHARACTER
【发布时间】:2013-02-08 21:50:58
【问题描述】:

我正在创建一个脚本来从一个站点下载一些 mp3 播客并将它们写入某个位置。我快完成了,正在下载和创建文件。但是,我遇到了无法完全解码二进制数据并且无法播放 mp3 文件的问题。

这是我的代码:

import re
import os
import urllib2
from bs4 import BeautifulSoup
import time

def getHTMLstring(url):
    html = urllib2.urlopen(url)
    soup = BeautifulSoup(html)
    soupString = soup.encode('utf-8')
    return soupString

def getList(html_string):
    urlList = re.findall('(http://podcast\.travelsinamathematicalworld\.co\.uk\/mp3/.*\.mp3)', html_string)
    firstUrl = urlList[0]
    finalList = [firstUrl]

    for url in urlList:
        if url != finalList[0]:
            finalList.insert(0,url)

    return finalList

def getBinary(netLocation):
    req = urllib2.urlopen(netLocation)
    reqSoup = BeautifulSoup(req)
    reqString = reqSoup.encode('utf-8')
    return reqString

def getFilename(string):
    splitTerms = string.split('/')
    fileName = splitTerms[-1]
    return fileName

def writeFile(sourceBinary, fileName):
    with open(fileName, 'wb') as fp:
        fp.write(sourceBinary)



def main():
    htmlString = getHTMLstring('http://www.travelsinamathematicalworld.co.uk')
    urlList = getList(htmlString)

    fileFolder = 'D:\\Dropbox\\Mathematics\\Travels in a Mathematical World\\Podcasts'
    os.chdir(fileFolder)

    for url in urlList:
        name = getFilename(url)
        binary = getBinary(url)
        writeFile(binary, name)
        time.sleep(2)



if __name__ == '__main__':
    main()

当我运行代码时,我在控制台中收到以下警告:

警告:root:某些字符无法解码,已被替换为 REPLACEMENT CHARACTER。

我认为这与我使用的数据以 UTF-8 编码这一事实有关,也许 write 方法需要不同的编码?我是 Python 新手(实际上是一般编程),但我被困住了。

【问题讨论】:

  • 向我们展示您的 trackback 并告诉我们错误到底发生在哪里。然后使用 pdb 或调试消息找出导致问题的有问题的字符串。
  • 回溯,是指控制台中弹出的错误信息吗?如果是这样,那就是问题......程序正常运行并创建文件,所以看起来没有任何问题。打印到控制台的唯一文本是我在原始帖子中列出的警告。
  • 是的,这就是回溯...

标签: python unicode encoding web-scraping beautifulsoup


【解决方案1】:

假设您想从 url 下载一些 mp3 文件。
您可以通过BeautifulSoup 检索这些网址。但是您不需要使用BeautifulSoup 来解析网址。您只需直接保存即可。
例如,

url = 'http://acl.ldc.upenn.edu/P/P96/P96-1004.pdf'
res = urllib2.urlopen(url)
with open(fileName, 'wb') as fp:
    fp.write(res.read())

如果我使用 BeautifulSoup 来解析该 pdf 网址

reqSoup = BeautifulSoup('http://acl.ldc.upenn.edu/P/P96/P96-1004.pdf')

reqSoup 不是 pdf 文件,而是 HTML 响应。其实是

<html><body><p>http://acl.ldc.upenn.edu/P/P96/P96-1004.pdf</p></body></html>

【讨论】:

  • 啊,这行得通。我不确定是什么让我认为我必须从二进制文件本身创建一个字符串。谢谢!!
猜你喜欢
  • 2017-04-14
  • 2020-03-09
  • 2015-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-10
  • 2022-11-10
相关资源
最近更新 更多