Строка Python печатается как [u'String ']


148

Конечно, это будет легко, но меня это действительно беспокоит.

У меня есть сценарий, который читает веб-страницу и использует Beautiful Soup для ее анализа. Из супа я извлекаю все ссылки, так как моя конечная цель - распечатать link.contents.

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

Каждый раз, когда я распечатываю переменную, содержащую строку «String», я получаю вывод [u'String']на экран. Есть ли простой способ вернуть это обратно в ascii или я должен написать регулярное выражение, чтобы удалить его?


возможный дубликат гораздо более четко сформулированного вопроса (и ответа): stackoverflow.com/q/2464959/1390788
Terrabits

Отвечает ли это на ваш вопрос? Какой префикс u в строке Python?
Terrabits

Ответы:


122

[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)

6
На самом деле вам не нужно выполнять кодирование, потому что OP видит только строку repr, потому что именно так вы видите что-либо при печати списка. soup [0] будет достаточно, чтобы показать str вместо repr, показывая содержимое строки, а не модификатор кавычки и юникода.
ironfroggy 01

2
В большинстве случаев не следует кодировать текст, представленный как Unicode, в байты: вы должны печатать Unicode непосредственно в Python:print(', '.join([u'ABC' , u'...']))
jfs

27

Вероятно, у вас есть список, содержащий одну строку юникода. Это 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)

1
Пожалуйста, избегайте таких ужасов, как repr(x).lstrip('u')[1:-1]. print ", ".join(my_list)Вместо этого используйте что-то вроде: для форматирования списка строк Unicode.
jfs

2
В комментарии говорится: «На самом деле это не лучший способ сделать это». Это просто для лолзов!
ddaa

10
import json, ast
r = {u'name': u'A', u'primary_key': 1}
ast.literal_eval(json.dumps(r)) 

напечатает

{'name': 'A', 'primary_key': 1}

1
этот метод мне кажется очень приятным, почему нет голосов? о каком влиянии на производительность нам следует беспокоиться?
jrich523

Просто использовал, import jsonа затем print json.dumps(myVar)помогло мне, спасибо!
ArendE

8

При доступе / печати списков отдельных элементов (например, последовательно или отфильтрованных):

my_list = [u'String'] # sample element
my_list = [str(my_list[0])]

1
вы делаете понимание списка:my_list = [str(my_list[x]) for x in range(len(my_list))]
gevang

4

передайте вывод в функцию str (), и она удалит преобразование вывода unicode. также, распечатав вывод, он удалит из него теги u ''.


4

[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. Или код молча создает моджибаке (поврежденные данные передаются дальше по конвейеру), если среда использует кодировку, несовместимую с жестко запрограммированной кодировкой.


3

Используйте dirили typeна «строке», чтобы узнать, что это такое. Я подозреваю, что это один из объектов тегов BeautifulSoup, который печатается как строка, но на самом деле это не так. В противном случае он находится внутри списка, и вам нужно преобразовать каждую строку отдельно.

В любом случае, почему вы возражаете против использования Unicode? Какая-то конкретная причина?


Я смотрю на BeautifulSoup последние несколько дней. Я не мог понять, как gnuchu получит u ['string'], а не [u'String ']. Его комментарий Эндрю Джаффе, кажется, доказывает, что это список.
batbrat 01

3

Вы действительно имеете в виду u'String'?

В любом случае, разве вы не можете просто str(string)получить строку, а не строку в Юникоде? (Это должно быть другим для Python 3, для которого все строки являются Unicode.)


Я должен был быть яснее. Я использую str (), но при печати все равно получаю вывод, как показано ниже. [u'ABC '] [u'DEF'] [u'GHI '] [u'JKL'] Данные удаляются как текст с веб-страницы, затем вставляются в базу данных (Google Appstore), затем извлекаются и распечатываются.
gnuchu 01


-2

Может быть, я не понимаю, почему вы не можете просто получить element.text, а затем преобразовать его перед использованием? например (не знаю, зачем вы это делаете, но ...) найдите все элементы меток веб-страницы и перебирайте их, пока не найдете тот, который называется MyText

        avail = []
        avail = driver.find_elements_by_class_name("label");
        for i in avail:
                if  i.text == "MyText":

Преобразуйте строку из i и делайте все, что хотите ... может быть, мне что-то не хватает в исходном сообщении? или это было то, что вы искали?


Вам не хватает части, в которой вопрос о том, как сделать «Преобразовать строку из i».
Натан Тагги

аааа, спасибо за все комментарии, я думал, проблема в том, чтобы преобразовать ценность
Стивен

но, честно говоря, i.text - это фактическое строковое значение, нет необходимости «вытаскивать его из массива», как предлагали некоторые люди, если, например, элемент метки имеет текстовое значение [u'String '] i.text будет String
Стивен
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.