Как мне закодировать / декодировать эту строку BeautifulSoup в Python, чтобы выводить нестандартные латинские символы? - PullRequest
0 голосов
/ 22 декабря 2018

Я очищаю страницу с Beautiful Soup, и вывод содержит нестандартные латинские символы, которые отображаются как шестнадцатеричные.

Я очищаю https://www.archchinese.com. Он содержит слова пиньинь, которые используютнестандартные символы латинского алфавита (например, ǎ, ā).Я пытался перебрать серию ссылок, содержащих пиньинь, используя функцию Beautifulstoup .string вместе с кодировкой utf-8 для вывода этих слов.Слово выходит с шестнадцатеричным в местах нестандартных символов.Слово «hǎo» выходит как «h \ xc7 \ x8eo».Я уверен, что я делаю что-то не так с кодированием, но я не знаю достаточно, чтобы знать, что исправить.Сначала я попытался декодировать с помощью utf-8, но я получаю сообщение об ошибке, что у элемента нет функции декодирования.Попытка напечатать строку без кодирования дает мне ошибку из-за того, что символы не определены, что, как я полагаю, связано с тем, что их сначала нужно кодировать во что-то.

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from bs4 import BeautifulSoup
import re

url = "https://www.archchinese.com/"

driver = webdriver.Chrome() #Set selenium up for opening page with Chrome.
driver.implicitly_wait(30)
driver.get(url)

driver.find_element_by_id('dictSearch').send_keys('好') # This character is hǎo.

python_button = driver.find_element_by_id('dictSearchBtn')
python_button.click() # Look for submit button and click it.

soup=BeautifulSoup(driver.page_source, 'lxml')

div = soup.find(id='charDef') # Find div with the target links.

for a in div.find_all('a', attrs={'class': 'arch-pinyin-font'}):
    print (a.string.encode('utf-8')) # Loop through all links with pinyin and attempt to encode.

Фактические результаты: b'h \ xc7\ x8eo 'b'h \ xc3 \ xa0o'

Ожидаемые результаты: hǎo hào

РЕДАКТИРОВАТЬ: Кажется, проблема связана с UnicodeEncodeError в Windows.Я пытался установить win-unicode-console, но не повезло.Спасибо snakecharmerb за информацию.

Ответы [ 2 ]

0 голосов
/ 22 декабря 2018

Используйте кодирование во время вызова BeautifulSoup, а не после.

soup=BeautifulSoup(driver.page_source.encode('utf-8'), 'lxml')

div = soup.find(id='charDef') # Find div with the target links.

for a in div.find_all('a', attrs={'class': 'arch-pinyin-font'}):
    print (a.string)
0 голосов
/ 22 декабря 2018

Вам не нужно кодировать значения при печати - функция печати позаботится об этом автоматически.Прямо сейчас вы печатаете представление байтов, составляющих закодированное значение, а не только саму строку.

>>> s = 'hǎo'
>>> print(s)
hǎo

>>> print(s.encode('utf-8'))
b'h\xc7\x8eo'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...