Python 3 / ошибка Unicode / запросы и BeautifulSoup

Я все еще в процессе изучения Python 3, и я пытаюсь сделать программу, которая использует запросы и BeautifulSoup, чтобы достичь этого.
Я новичок в обоих модулях.

У меня эта ошибка, связанная с Unicode, потому что я пытаюсь сохранить код в файле перед его анализом.

Ошибка:

 Traceback (most recent call last):
    File "C:UsersGonçaloDesktopCodingPythonWeb CrawlerImage Retriver.py", line 25, in <module>
    saveFile.write(soup)
  File "C:Python34libencodingscp1252.py", line 19, in encode
    return codecs.charmap_encode(input,self.errors,encoding_table)[0]
UnicodeEncodeError: 'charmap' codec can't encode character 'u200e' in position 145890: character maps to <undefined>

Код:

    import requests
    from bs4 import BeautifulSoup
    import os


url = "https://www.google.pt/search?q=hello"
req = requests.get(url)
resp = req.text
soup = BeautifulSoup(resp,"html.parser")
soup = soup.prettify()


dir_list = os.listdir()
if "Image Retriever Files" not in dir_list:
        os.makedir("Image Retriever Files")
curDir = os.curdir
filename = curDir+"/Image Retriever Files/Search Results.html"
saveFile = open(filename,"w")
saveFile.write(soup)
saveFile.close()

Спасибо за любую помощь!

2 ответа

  1. Это может приблизить вас, но у вас будут другие проблемы, вы должны обернуть это в блоке try/except и расширить это, если с другим, потому что вы не указали, что вы хотите, чтобы он сделал, если папка существовала(вы получите ошибку, если она существует).

    import requests
    from bs4 import BeautifulSoup
    import os
    
    url = "https://www.google.pt/search?q=hello"
    req = requests.get(url)
    resp = req.text
    soup = BeautifulSoup(resp, "html.parser")
    soup = soup.prettify()
    
    dir_list = os.getcwd()
    if "imageFile" not in dir_list:
        os.mkdir("imageFile")
    curDir = os.curdir
    filename = curDir + "/imageFile/SearchResults.html"
    saveFile = open(filename, "wb")
    saveFile.write('files')
    saveFile.close()
    

    Я надеюсь, что это приведет вас на правильный путь. Если он попал в флажок, и если нет, я здесь, чтобы помочь.
    С уважением,
    Джейсон

  2. Это похоже на этот вопрос . Ваша проблема-это особенность unicode. В начале был ASCII и 128 символов было все, что когда-либо требовалось.

    И тогда некоторые умные люди увидели, что 8 бит для символа дадут им 256 символов, и таким образом родились кодовые страницы, где различные системы будут использовать символы 128-256 для символов и буквы для других языков. И все было хорошо, пока люди не захотели представить более одного языка в файле, или, боже упаси, язык с более чем 256 символами.

    И тогда некоторые другие яркие люди сказали использовать больше бит! Но сколько 16?, 32? Но что делать, если я не хочу, чтобы мой размер файла удваивался или четырехкратно? И более умные люди сказали «Просто мы будем использовать кодировку» и, таким образом, родился utf-8 и ISO 8859-1 и им подобные. И более умные люди сказали, что давайте дадим каждому символу и символу их одно истинное значение и число, таким образом, родился unicode.

    «\u200e » — это символ Юникода, обозначающий текст, отображаемый слева направо. Он не имеет эквивалента клавиатуры.
    saveFile = open (filename,»w») пытается записать в стандартный текстовый файл, и он предполагает, что everycharacter может быть записан с 8-битным значением. ‘u200e’ имеет десятичное значение 8,206. Чтобы решить вашу проблему, вам нужно выбрать кодировку, как utf-8 явно, так что ваши строки могут быть записаны в файл в удобочитаемом виде. Просто изменение типа файла на saveFile = open (filename, «wb») просто выбивает банку вниз по дороге, когда вы пытаетесь прочитать файл.

    Ознакомьтесь с этой статьей от Joel Spolsky на абсолютном минимуме каждый разработчик программного обеспечения абсолютно, положительно должен знать о Unicode и наборах символов (никаких оправданий!)