Конечно, это будет легко, но меня это действительно беспокоит.
У меня есть сценарий, который читает веб-страницу и использует Beautiful Soup для ее анализа. Из супа я извлекаю все ссылки, так как моя конечная цель - распечатать link.contents.
Весь текст, который я разбираю, имеет кодировку ASCII. Я знаю, что Python обрабатывает строки как юникод, и я уверен, что это очень удобно, просто бесполезно в моем маленьком скрипте.
Каждый раз, когда я распечатываю переменную, содержащую строку «String», я получаю вывод [u'String']
на экран. Есть ли простой способ вернуть это обратно в ascii или я должен написать регулярное выражение, чтобы удалить его?
Ответы:
[u'ABC']
будет одноэлементным списком строк Unicode. Beautiful Soup всегда производит Unicode . Поэтому вам нужно преобразовать список в одну строку Unicode, а затем преобразовать ее в ASCII.Я не знаю точно, как вы получили одноэлементные списки; член содержимого будет списком строк и тегов, что явно не то, что у вас есть. Предполагая, что вы действительно всегда получаете список с одним элементом, и что ваш тест действительно только ASCII, вы бы использовали это:
soup[0].encode("ascii")
Однако, пожалуйста, еще раз проверьте, что ваши данные действительно в формате ASCII. Это довольно редко. Скорее всего, это latin-1 или utf-8.
soup[0].encode("latin-1") soup[0].encode("utf-8")
Или вы спрашиваете Beautiful Soup, какова была исходная кодировка, и возвращаете ее в этой кодировке:
soup[0].encode(soup.originalEncoding)
источник
print(', '.join([u'ABC' , u'...']))
Вероятно, у вас есть список, содержащий одну строку юникода. Это
repr
есть[u'String']
.Вы можете преобразовать это в список байтовых строк, используя любой вариант следующего:
# Functional style. print map(lambda x: x.encode('ascii'), my_list) # List comprehension. print [x.encode('ascii') for x in my_list] # Interesting if my_list may be a tuple or a string. print type(my_list)(x.encode('ascii') for x in my_list) # What do I care about the brackets anyway? print ', '.join(repr(x.encode('ascii')) for x in my_list) # That's actually not a good way of doing it. print ' '.join(repr(x).lstrip('u')[1:-1] for x in my_list)
источник
repr(x).lstrip('u')[1:-1]
.print ", ".join(my_list)
Вместо этого используйте что-то вроде: для форматирования списка строк Unicode.import json, ast r = {u'name': u'A', u'primary_key': 1} ast.literal_eval(json.dumps(r))
напечатает
{'name': 'A', 'primary_key': 1}
источник
import json
а затемprint json.dumps(myVar)
помогло мне, спасибо!При доступе / печати списков отдельных элементов (например, последовательно или отфильтрованных):
my_list = [u'String'] # sample element my_list = [str(my_list[0])]
источник
my_list = [str(my_list[x]) for x in range(len(my_list))]
передайте вывод в функцию str (), и она удалит преобразование вывода unicode. также, распечатав вывод, он удалит из него теги u ''.
источник
[u'String']
- текстовое представление списка, содержащего строку Unicode на Python 2.Если вы запустите,
print(some_list)
то это эквивалентноprint'[%s]' % ', '.join(map(repr, some_list))
созданию текстового представления объекта Python с типомlist
,repr()
функция вызывается для каждого элемента.Не путайте объект Python и его текстовое представление -
repr('a') != 'a'
и даже текстовое представление текста представления различен:repr(repr('a')) != repr('a')
.repr(obj)
возвращает строку, содержащую печатное представление объекта. Его цель - однозначное представление объекта, который может быть полезен для отладки, в REPL. Частоeval(repr(obj)) == obj
.Чтобы избежать вызова
repr()
, вы можете распечатать элементы списка напрямую (если все они являются строками Unicode), например:print ",".join(some_list)
- он печатает список строк, разделенных запятыми:String
Не кодируйте строку Unicode в байты с использованием жестко заданной кодировки символов, вместо этого печатайте Unicode напрямую . В противном случае код может потерпеть неудачу, потому что кодировка не может представлять все символы, например, если вы попытаетесь использовать
'ascii'
кодировку с символами, отличными от ascii. Или код молча создает моджибаке (поврежденные данные передаются дальше по конвейеру), если среда использует кодировку, несовместимую с жестко запрограммированной кодировкой.источник
Используйте
dir
илиtype
на «строке», чтобы узнать, что это такое. Я подозреваю, что это один из объектов тегов BeautifulSoup, который печатается как строка, но на самом деле это не так. В противном случае он находится внутри списка, и вам нужно преобразовать каждую строку отдельно.В любом случае, почему вы возражаете против использования Unicode? Какая-то конкретная причина?
источник
Вы действительно имеете в виду
u'String'
?В любом случае, разве вы не можете просто
str(string)
получить строку, а не строку в Юникоде? (Это должно быть другим для Python 3, для которого все строки являются Unicode.)источник
encode("latin-1")
помогли мне в моем случае:facultyname[0].encode("latin-1")
источник
Может быть, я не понимаю, почему вы не можете просто получить element.text, а затем преобразовать его перед использованием? например (не знаю, зачем вы это делаете, но ...) найдите все элементы меток веб-страницы и перебирайте их, пока не найдете тот, который называется MyText
avail = [] avail = driver.find_elements_by_class_name("label"); for i in avail: if i.text == "MyText":
Преобразуйте строку из i и делайте все, что хотите ... может быть, мне что-то не хватает в исходном сообщении? или это было то, что вы искали?
источник