Eliminar ‘u de una salida webscrape

Hola, estoy usando Beautifulsoup para analizar un sitio web y obtener un nombre como salida. Pero después de ejecutar el script, obtengo una [u'word1', u'word2', u'word3'] . Lo que estoy buscando es 'word1 word2 word3' . ¿Cómo deshacerte de esto y convertir el resultado en una sola cadena?

 from bs4 import BeautifulSoup import urllib2 import re myfile = open("base/dogs.txt","w+") myfile.close() url="http://trackinfo.com/entries-race.jsp?raceid=GBR$20140302A01" page=urllib2.urlopen(url) soup = BeautifulSoup(page.read()) names=soup.findAll('a',{'href':re.compile("dog")}) myfile = open("base/dogs.txt","w+") for eachname in names: d = (str(eachname.string.split()))+"\n" print [x.encode('ascii') for x in d] myfile.write(d) myfile.close() 

Las respuestas aquí usando .encode() le dan lo que pide, pero probablemente no lo que necesita. Puede mantener la encoding Unicode y no representar las cosas de una manera que le muestre cuál es su encoding o tipo. Por lo tanto, seguirán siendo [u'word1', u'word2', u'word3'] , lo que evita la ruptura de soporte para idiomas que no se pueden representar en ASCII, pero se imprimen como word1 word2 word3 .

Solo haz:

 for eachname in names: d = ' '.join(eachname.string.split()) + '\n' print d myfile.write(d) 

BeautifulSoup y Unicode, Maldita sea !

 >>> from bs4 import BeautifulSoup >>> BeautifulSoup("Sacré bleu!") 

Sacré bleu!

¿No es genial? Al hacer la sopa, el documento se convierte a Unicode y las entidades HTML se convierten a caracteres Unicode. Entonces obtienes objetos Unicode como resultados. Como pretendía. Nada de malo con eso.

Así que tu pregunta es sobre Unicode. Y Unicode se explica en este video . ¿No te gustan los videos? Lea una introducción a Unicode .

La u es la abreviatura de “La siguiente operación es codificada en Unicode” . En lugar de 128 caracteres ASCII, ahora puede usar todos los caracteres Unicode. Más de 110.000 en este momento. La u no se guarda en un archivo o base de datos. Es un comentario visual para que pueda ver que está tratando con una cadena codificada en Unicode. Úsalo como si fuera una cadena normal, porque es una cadena normal.

Moraleja de esta historia:

☺ cuando ves un u'…'

BeutifulSoap es un analizador html realmente impresionante. Utilícelo a su máximo potencial para analizar html. Así que solo modifica tu código como sigue

 names=[texts.text for texts in soup.findAll('a',{'href':re.compile("dog")})] 

esto tomará el d = (str(eachname.string.split()))+"\n" entre las tabs de anclaje para que no necesites d = (str(eachname.string.split()))+"\n"

Así que el código final será

 from bs4 import BeautifulSoup import urllib2 import re import codecs url="http://trackinfo.com/entries-race.jsp?raceid=GBR$20140302A01" page=urllib2.urlopen(url) soup = BeautifulSoup(page.read()) names=[texts.text for texts in soup.findAll('a',{'href':re.compile("dog")})] myfile = codecs.open("base/dogs.txt","wb",encoding="Utf-8") for eachname in names: eachname=re.sub(r"[\t\n]","",eachname) myfile.write(eachname+"\n") myfile.close() 

Si solo lo necesita sin u en el archivo, use codecs.open() o io.open() para abrir un archivo de texto usando una encoding de texto apropiada (es decir, encoding="..." ) en lugar de abrir un bytefile con open() .

eso sería

 myfile = codecs.open("base/dogs.txt","w+",encoding="Utf-8") 

en tu caso.

y la salida en el archivo será

 BARTSSHESWAYCOOL DK'S SEND ALL SHAKIN THINGS UP FROSTED COOKIE JD EMBELLISH WW CASH N CARRY FREEDOM ROCK HVAC BUTCHIE 

También vea esta pregunta que había preguntado por casi el mismo problema