что такое ошибка кодирования uni code в приведенном ниже коде

Я получаю следующую ошибку кодировки Unicode.

Когда я запускаю программу, представленную ниже, я получаю сообщение об ошибке, связанной с кодировкой Unicode.

import bs4
import requests
from xhtml2pdf import pisa  # import python module
from xhtml2pdf.config.httpconfig import httpConfig

res = requests.get("https://www.insightsonindia.com/2018/06/04/insights-daily-current-affairs-04-june-2018/")
soup = bs4.BeautifulSoup(res.text, 'lxml')
pf = soup.find("div", class_="pf-content")

sourceHtml =str(pf)
outputFilename = "test.pdf"

def convertHtmlToPdf(sourceHtml, outputFilename):
    # open output file for writing (truncated binary)

    httpConfig.save_keys('nosslcheck', True)

    resultFile = open(outputFilename, "w+b")

    # convert HTML to PDF
    pisaStatus = pisa.CreatePDF(sourceHtml, dest=resultFile, encoding="utf-8")

    # close output file
    resultFile.close()  # close output file

    # return True on success and False on errors
    return pisaStatus.err

# Main program
if __name__ == "__main__":
    pisa.showLogging()
    convertHtmlToPdf(sourceHtml, outputFilename)

Ошибка указана ниже

self._output(request.encode('ascii'))
UnicodeEncodeError: 'ascii' codec can't encode character '\u2019' in position 37: ordinal not in range(128)

Я пытаюсь загрузить часть веб-сайта, используя xhtml2pdf. Для этого я использовал bs4, очистил сайт и сохранил его. Затем сохраните его в pdf с помощью xhtml2pdf. Большую часть времени это работало как шарм. Но для этого случая это дает мне ошибку. Ссылка на полный код в github дана ниже

Ссылка на полный код доступна здесь

xhtml2pdf кодируется с помощью ascii, поскольку мой html-файл содержит символы, отличные от ascii, он показывает ошибку. И я не знаю, как изменить кодировщик в xhtml2pdf. Опускать символы, отличные от ascii, нельзя. Если я проигнорирую это, ссылка на изображение будет повреждена, и изображение не будет отображаться в формате PDF.

complete traceback

```Traceback (most recent call last):
  File "test3.py", line 80, in 
    convertHtmlToPdf(sourceHtml, outputFilename)
  File "test3.py", line 68, in convertHtmlToPdf
    pisaStatus = pisa.CreatePDF(sourceHtml, dest=resultFile, encoding= 'utf-8')
  File "C:\Users\Ananthu\AppData\Local\Programs\Python\Python37-32\lib\site-packages\xhtml2pdf\document.py", line 97, in pisaDocument
    encoding, context=context, xml_output=xml_output)
  File "C:\Users\Ananthu\AppData\Local\Programs\Python\Python37-32\lib\site-packages\xhtml2pdf\document.py", line 59, in pisaStory
    pisaParser(src, context, default_css, xhtml, encoding, xml_output)
  File "C:\Users\Ananthu\AppData\Local\Programs\Python\Python37-32\lib\site-packages\xhtml2pdf\parser.py", line 759, in pisaParser
    pisaLoop(document, context)
  File "C:\Users\Ananthu\AppData\Local\Programs\Python\Python37-32\lib\site-packages\xhtml2pdf\parser.py", line 700, in pisaLoop
    pisaLoop(node, context, path, **kw)
  File "C:\Users\Ananthu\AppData\Local\Programs\Python\Python37-32\lib\site-packages\xhtml2pdf\parser.py", line 644, in pisaLoop
    pisaLoop(nnode, context, path, **kw)
  File "C:\Users\Ananthu\AppData\Local\Programs\Python\Python37-32\lib\site-packages\xhtml2pdf\parser.py", line 644, in pisaLoop
    pisaLoop(nnode, context, path, **kw)
  File "C:\Users\Ananthu\AppData\Local\Programs\Python\Python37-32\lib\site-packages\xhtml2pdf\parser.py", line 644, in pisaLoop
    pisaLoop(nnode, context, path, **kw)
  [Previous line repeated 2 more times]
  File "C:\Users\Ananthu\AppData\Local\Programs\Python\Python37-32\lib\site-packages\xhtml2pdf\parser.py", line 514, in pisaLoop
    attr = pisaGetAttributes(context, node.tagName, node.attributes)
  File "C:\Users\Ananthu\AppData\Local\Programs\Python\Python37-32\lib\site-packages\xhtml2pdf\parser.py", line 124, in pisaGetAttributes
    nv = c.getFile(nv)
  File "C:\Users\Ananthu\AppData\Local\Programs\Python\Python37-32\lib\site-packages\xhtml2pdf\context.py", line 818, in getFile
    return getFile(name, relative or self.pathDirectory)
  File "C:\Users\Ananthu\AppData\Local\Programs\Python\Python37-32\lib\site-packages\xhtml2pdf\util.py", line 738, in getFile
    file = pisaFileObject(*a, **kw)
  File "C:\Users\Ananthu\AppData\Local\Programs\Python\Python37-32\lib\site-packages\xhtml2pdf\util.py", line 644, in init
    conn.request("GET", path)
  File "C:\Users\Ananthu\AppData\Local\Programs\Python\Python37-32\lib\http\client.py", line 1229, in request
    self._send_request(method, url, body, headers, encode_chunked)
  File "C:\Users\Ananthu\AppData\Local\Programs\Python\Python37-32\lib\http\client.py", line 1240, in _send_request
    self.putrequest(method, url, **skips)
  File "C:\Users\Ananthu\AppData\Local\Programs\Python\Python37-32\lib\http\client.py", line 1107, in putrequest
    self._output(request.encode('ascii'))
UnicodeEncodeError: 'ascii' codec can't encode character '\u2019' in position 37: ordinal not in range(128)


person ksananthu    schedule 08.02.2019    source источник
comment
Для U+2019 (’) эквивалента ASCII нет; метод encode не пытается сопоставить не-ASCII-символы с похожими ASCII-символами.   -  person chepner    schedule 08.02.2019
comment
Тем не менее, я не уверен, почему CreatePDF (единственный вероятный кандидат) пытается преобразовать произвольный текст Unicode в ASCII.   -  person chepner    schedule 08.02.2019
comment
@ caco3, пожалуйста, обратитесь к полному коду, указанному ниже по ссылке.   -  person ksananthu    schedule 08.02.2019
comment
@chepner Как я могу заставить эту программу работать, у вас есть предложения? Пожалуйста, обратитесь к полному коду ниже. Я новичок в питоне. Так что, пожалуйста, объясните процесс также   -  person ksananthu    schedule 08.02.2019
comment
Не размещайте ссылку на полный код. Опубликуйте здесь полный минимальный пример, который мы могли бы запустить, чтобы воспроизвести ошибку.   -  person chepner    schedule 08.02.2019
comment
@chepner Полный код опубликован   -  person ksananthu    schedule 08.02.2019
comment
Какую версию Python вы используете для запуска своей программы?   -  person snakecharmerb    schedule 09.02.2019
comment
@snakecharmerb питон 3.4   -  person ksananthu    schedule 09.02.2019


Ответы (1)


Проблема заключается в том, что полученный HTML-код содержит теги img, некоторые из атрибутов src которых являются URL-адресами, содержащими символ '\u2019' («ПРАВАЯ ОДНА КАВАТЫ»).

xhtml2pdf передает эти URL-адреса в модуль Python https://docs.python.org/3/library/http.client.html, не экранируя их. первый. http.client пытается закодировать URL-адреса как ASCII перед их получением, и возникает ошибка.

Это можно обойти, избегая URL-адресов в извлеченном html перед созданием pdf.

urllib.parse предоставляет инструменты для этого.

from urllib import parse
...
res = requests.get("https://www.insightsonindia.com/2018/06/04/insights-daily-current-affairs-04-june-2018/")
soup = bs4.BeautifulSoup(res.text, 'lxml')
pf = soup.find("div", class_="pf-content")

imgs = pf.find_all('img')
for img in imgs: 
    url = img['src'] 
    scheme, netloc, path, params, query, fragment = parse.urlparse(url)
    new_path = parse.quote(path)
    new_url = parse.urlunparse((scheme, netloc, new_path, params, query, fragment))
    img['src'] = new_url

sourceHtml =str(pf)
outputFilename = "test.pdf"
...

Ответы на этот вопрос содержат некоторую справочную информацию о юникоде и URL-адресах.

person snakecharmerb    schedule 09.02.2019
comment
Спасибо. Это работает как шарм - person ksananthu; 09.02.2019