Неправильные символы с акцентом при использовании Beautiful Soup в Python в локальном HTML файле - PullRequest
0 голосов
/ 18 марта 2020

Я хорошо знаком с Beautiful Soup в Python, я всегда использовал для очистки живого сайта.

Теперь я очищаю локальный файл HTML ( ссылка ) (в случае, если вы хотите проверить код), единственная проблема заключается в том, что акцентированные символы не представлены правильно (это никогда не происходило со мной при очистке живых сайтов).

Это упрощенная версия код

import requests, urllib.request, time, unicodedata, csv
from bs4 import BeautifulSoup

soup = BeautifulSoup(open('AH.html'), "html.parser")
tables = soup.find_all('table')
titles = tables[0].find_all('tr')
print(titles[55].text)

, который печатает следующий вывод

2:22 - Il Destino È Già Scritto (2017 ITA/ENG) [1080p] [BLUWORLD]

, в то время как правильный вывод должен быть

2:22 - Il Destino È Già Scritto (2017 ITA/ENG) [1080p] [BLUWORLD]


Я искал решение, прочитал много вопросов / ответов и нашел этот ответ , который я реализовал следующим образом

import requests, urllib.request, time, unicodedata, csv
from bs4 import BeautifulSoup
import codecs

response = open('AH.html')
content = response.read()
html = codecs.decode(content, 'utf-8')
soup = BeautifulSoup(html, "html.parser")

Однако он запускает следующую ошибку

Traceback (most recent call last):
  File "C:\Users\user\AppData\Local\Programs\Python\Python37-32\lib\encodings\utf_8.py", line 16, in decode
    return codecs.utf_8_decode(input, errors, True)
TypeError: a bytes-like object is required, not 'str'

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "C:\Users\user\Desktop\score.py", line 8, in <module>
    html = codecs.decode(content, 'utf-8')
TypeError: decoding with 'utf-8' codec failed (TypeError: a bytes-like object is required, not 'str')

Думаю, проблему легко решить, но как это сделать?

Ответы [ 2 ]

0 голосов
/ 18 марта 2020

Использование open('AH.html') декодирует файл с использованием кодировки по умолчанию, которая не может быть кодировкой файла. BeautifulSoup понимает заголовки HTML, в частности следующее содержимое указывает, что файл имеет кодировку UTF-8:

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

Откройте файл в двоичном режиме и дайте BeautifulSoup понять его:

with open("AH.html","rb") as f:
    soup = BeautifulSoup(f, 'html.parser')

Иногда сайты неправильно устанавливают кодировку. В этом случае вы можете указать кодировку самостоятельно, если знаете, какой она должна быть.

with open("AH.html",encoding='utf8') as f:
    soup = BeautifulSoup(f, 'html.parser')
0 голосов
/ 18 марта 2020
from bs4 import BeautifulSoup


with open("AH.html") as f:
    soup = BeautifulSoup(f, 'html.parser')
    tb = soup.find("table")
    for item in tb.find_all("tr")[55]:
        print(item.text)

enter image description here

Я должен сказать, что ваш первый код на самом деле в порядке и должен работать.

Что касается второго кода, вы пытаются decode str, что неисправно. поскольку decode функция предназначена для byte object.

Я полагаю, что вы используете Windows, где его кодировка по умолчанию cp1252, а не UTF-8.

Не могли бы вы выполнить следующий код:

import sys

print(sys.getdefaultencoding())
print(sys.stdin.encoding)
print(sys.stdout.encoding)
print(sys.stderr.encoding)

и проверить вывод, если он UTF-8 или cp1252.

обратите внимание, что если вы используете VSCode с Code-Runner, пожалуйста, запустите ваш код в терминале как py code.py

РЕШЕНИЯ (из чата)

(1) Если вы находитесь на windows 10

  • Откройте панель управления и измените представление с помощью маленьких значков
  • Нажмите Регион
  • Перейдите на вкладку «Администрация»
  • Нажмите Изменить языковой стандарт системы ...
  • Установите флажок «Бета: использовать Unicode UTF-8 ...»
  • Нажмите OK и перезапустите ваш p ​​c

(2) Если вы не включены Windows 10 или просто не хотите изменять предыдущую настройку, затем в первом коде измените open("AH.html") на open("AH.html", encoding="UTF-8"), то есть напишите:

from bs4 import BeautifulSoup

with open("AH.html", encoding="UTF-8") as f:
    soup = BeautifulSoup(f, 'html.parser')
    tb = soup.find("table")
    for item in tb.find_all("tr")[55]:
        print(item.text)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...