Строка Python печатается как [u'String '] - PullRequest
124 голосов
/ 01 марта 2009

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

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

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

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

Ответы [ 10 ]

102 голосов
/ 01 марта 2009

[u'ABC'] будет одноэлементным списком строк Unicode. Beautiful Soup всегда производит Unicode . Таким образом, вам нужно преобразовать список в одну строку Unicode, а затем преобразовать его в ASCII.

Я не знаю точно, как вы получили списки из одного элемента; Элемент содержимого будет список строк и тегов, который, очевидно, не то, что у вас есть. Предполагая, что вы действительно всегда получаете список с одним элементом, и что ваш тест действительно только ASCII, вы можете использовать это:

 soup[0].encode("ascii")

Однако, пожалуйста, проверьте еще раз, что ваши данные действительно являются ASCII. Это довольно редко. Гораздо более вероятно, что это латиница-1 или utf-8.

 soup[0].encode("latin-1")


 soup[0].encode("utf-8")

Или вы спрашиваете Beautiful Soup, какова была оригинальная кодировка, и возвращаете ее в этой кодировке:

 soup[0].encode(soup.originalEncoding)
21 голосов
/ 01 марта 2009

Возможно, у вас есть список, содержащий одну строку Юникода. 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)
7 голосов
/ 17 октября 2016
import json, ast
r = {u'name': u'A', u'primary_key': 1}
ast.literal_eval(json.dumps(r)) 

напечатает

{'name': 'A', 'primary_key': 1}
7 голосов
/ 09 февраля 2013

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

my_list = [u'String'] # sample element
my_list = [str(my_list[0])]
4 голосов
/ 28 апреля 2013

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

2 голосов
/ 27 апреля 2016

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

2 голосов
/ 01 марта 2009

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

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

1 голос
/ 01 марта 2009

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

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

0 голосов
/ 14 мая 2017

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

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

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

0 голосов
/ 12 апреля 2015

encode("latin-1") помог мне в моем случае:

facultyname[0].encode("latin-1")
...