Certamente será fácil, mas está realmente me incomodando.
Eu tenho um script que lê em uma página da web e usa Beautiful Soup para analisá-lo. Da sopa , extraio todos os links, pois meu objetivo final é imprimir o link.contents.
Todo o texto que estou analisando é ASCII. Eu sei que o Python trata as strings como unicode, e tenho certeza de que isso é muito útil, mas que não serve para nada no meu script pequenino.
Toda vez que imprimo uma variável que contém 'String', sou [u'String']
impressa na tela. Existe uma maneira simples de colocar isso de volta em apenas ASCII ou devo escrever um regex para removê-lo?
Respostas:
[u'ABC']
seria uma lista de um elemento de cadeias unicode. Beautiful Soup sempre produz Unicode . Portanto, você precisa converter a lista em uma única cadeia unicode e, em seguida, convertê-la em ASCII.Não sei exatamente como você conseguiu as listas de um elemento; o membro do conteúdo seria uma lista de strings e tags, o que aparentemente não é o que você possui. Supondo que você realmente sempre obtenha uma lista com um único elemento e que seu teste seja realmente apenas ASCII, você usaria isso:
No entanto, verifique se seus dados são realmente ASCII. Isso é bem raro. Muito mais provavelmente é latin-1 ou utf-8.
Ou você pergunta à Beautiful Soup qual era a codificação original e a recupera de novo nesta codificação:
fonte
print(', '.join([u'ABC' , u'...']))
Você provavelmente tem uma lista contendo uma string unicode. O
repr
disso é[u'String']
.Você pode converter isso em uma lista de cadeias de bytes usando qualquer variação do seguinte:
fonte
repr(x).lstrip('u')[1:-1]
. Use algo como: emprint ", ".join(my_list)
vez disso, para formatar uma lista de strings Unicode.irá imprimir
fonte
Se acessar / imprimir listas de elementos únicos (por exemplo, sequencialmente ou filtradas):
fonte
my_list = [str(my_list[x]) for x in range(len(my_list))]
passe a saída para a função str () e removerá a conversão da saída unicode. também, imprimindo a saída, ela removerá as tags u ''.
fonte
[u'String']
é uma representação de texto de uma lista que contém uma string Unicode no Python 2.Se você executar
print(some_list)
, é equivalente aprint'[%s]' % ', '.join(map(repr, some_list))
, por exemplo, criar uma representação de texto de um objeto Python com o tipolist
,repr()
função será chamada para cada item.Não confunda um objeto Python e sua representação de texto -
repr('a') != 'a'
e mesmo a representação de texto da representação de texto é diferente:repr(repr('a')) != repr('a')
.repr(obj)
retorna uma sequência que contém uma representação imprimível de um objeto. Seu objetivo é ser uma representação inequívoca de um objeto que possa ser útil para depuração, em um REPL. Frequentementeeval(repr(obj)) == obj
.Para evitar chamadas
repr()
, você pode imprimir os itens da lista diretamente (se forem todos strings Unicode), por exemplo:print ",".join(some_list)
—exibe uma lista separada por vírgulas das strings:String
Não codifique uma cadeia de caracteres Unicode em bytes usando uma codificação de caracteres codificada, imprima diretamente o Unicode . Caso contrário, o código poderá falhar porque a codificação não pode representar todos os caracteres, por exemplo, se você tentar usar a
'ascii'
codificação com caracteres não-ascii. Ou o código produz silenciosamente mojibake (dados corrompidos são transmitidos ainda mais em um pipeline) se o ambiente usar uma codificação incompatível com a codificação codificada.fonte
Use
dir
outype
na 'string' para descobrir o que é. Eu suspeito que seja um dos objetos de tag da BeautifulSoup, que imprime como uma string, mas realmente não é um. Caso contrário, ele estará dentro de uma lista e você precisará converter cada sequência separadamente.De qualquer forma, por que você está se opondo ao uso do Unicode? Algum motivo específico?
fonte
Você realmente quer dizer
u'String'
?De qualquer forma, você não pode fazer apenas
str(string)
uma string em vez de uma string unicode? (Isso deve ser diferente para o Python 3, para o qual todas as strings são unicode.)fonte
encode("latin-1")
me ajudou no meu caso:fonte
Talvez eu não entenda, por que você não pode simplesmente pegar o elemento.text e convertê-lo antes de usá-lo? por exemplo (não sei por que você faria isso, mas ...) encontre todos os elementos de rótulo da página da web e itere entre eles até encontrar um chamado MyText
Converta a string de i e faça o que você quiser fazer ... talvez esteja faltando alguma coisa na mensagem original? ou era isso que você estava procurando?
fonte