Строка Python печатает как [u'String ']
Это, безусловно, будет легко, но это действительно подшучивает над мной.
У меня есть script, который читается на веб-странице и использует Beautiful Soup для его анализа. Из супа я извлекаю все ссылки, так как моя конечная цель - распечатать ссылку. Контент.
Весь текст, который я обрабатываю, является ASCII. Я знаю, что Python рассматривает строки как unicode, и я уверен, что это очень удобно, просто бесполезно в моем wee script.
Каждый раз, когда я иду распечатать переменную, содержащую "String", я получаю [u'String']
, напечатанную на экране. Есть ли простой способ получить это обратно в просто ascii или мне написать регулярное выражение, чтобы разделить его?
Ответы
Ответ 1
[u'ABC']
будет одноэлементным списком строк unicode. Beautiful Soup всегда производит 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)
Ответ 2
Вероятно, у вас есть список, содержащий одну строку юникода. 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 actually not a good way of doing it.
print ' '.join(repr(x).lstrip('u')[1:-1] for x in my_list)
Ответ 3
При доступе/печати отдельных списков элементов (например, последовательно или отфильтрованных):
my_list = [u'String'] # sample element
my_list = [str(my_list[0])]
Ответ 4
передать результат функции str(), и он удалит преобразование вывода в unicode.
также путем печати вывода он удалит из него теги '' '' ''.
Ответ 5
import json, ast
r = {u'name': u'A', u'primary_key': 1}
ast.literal_eval(json.dumps(r))
напечатает
{'name': 'A', 'primary_key': 1}
Ответ 6
Вы действительно имеете в виду u'String'
?
В любом случае не можете ли вы просто сделать str(string)
, чтобы получить строку, а не строку unicode? (Это должно быть разным для Python 3, для которого все строки являются unicode.)
Ответ 7
Используйте dir
или type
в строке, чтобы узнать, что это такое. Я подозреваю, что это один из объектов тегов BeautifulSoup, который печатает как строку, но на самом деле это не так. В противном случае его внутри списка, и вам нужно преобразовать каждую строку отдельно.
В любом случае, почему вы возражаете против использования Unicode? Любая конкретная причина?
Ответ 8
[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)
-it печатает список строк, разделенных запятыми: String
Не кодируйте строку Юникода в байты с использованием кодировки с жесткой кодировкой, а печатать Unicode напрямую. В противном случае код может выйти из строя, потому что кодирование не может представлять все символы, например, если вы пытаетесь использовать кодировку 'ascii'
с символами, отличными от ascii. Или код молча производит mojibake (поврежденные данные передаются далее в конвейере), если среда использует кодировку, которая несовместима с жестко кодированной кодировкой.
Ответ 9
encode("latin-1")
помог мне в моем случае:
facultyname[0].encode("latin-1")
Ответ 10
Возможно, я не понимаю, почему вы не можете получить элемент element.text, а затем преобразовать его, прежде чем использовать его?
например (не знаю, зачем вы это делаете, но...)
найдите все элементы ярлыков веб-страницы и повторите их, пока не найдете один из них, называемый MyText
avail = []
avail = driver.find_elements_by_class_name("label");
for i in avail:
if i.text == "MyText":
Преобразуйте строку из я и сделайте все, что вы хотели сделать...
возможно, что-то не хватает в исходном сообщении?
или это было то, что вы искали?