Подтвердить что ты не робот

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

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

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

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

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

4b9b3361

Ответ 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":

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