Sto utilizzando BeautifulSoup per analizzare un sito Web. La pagina del sito web viene visualizzata correttamente nel mio browser:BeautifulSoup mi fornisce simboli unicode + html, piuttosto che unicode diritto. È un bug o un malinteso?
La relazione di Oxfam International intitolata "Fuorigioco! http://www.coopamerica.org/programs/responsibleshopper/company.cfm?id=271
In particolare, le virgolette singole e doppie osservano benissimo. Sembrano simboli html piuttosto che ascii, anche se stranamente quando guardo la fonte in FF3 sembrano essere normali ascii.
Purtroppo, quando ho raschiare ottengo qualcosa di simile
u'Oxfam Internazionale \ xe2 € ™ s rapporto intitolato \ xe2 € œOffside!
oops, voglio dire questo:
u'Oxfam International\xe2€™s report entitled \xe2€œOffside!
metadati della pagina indica la codifica 'iso-88.959-1'. Ho provato diverse codifiche, giocato con le funzioni di unicode-> ascii e html-> ascii di terze parti, e ho esaminato la discrepanza MS/iso-8859-1, ma il fatto è che ™ non ha nulla a che fare con un citazione singola, e non riesco a trasformare la combinazione unicode + htmlsymbol nel giusto simbolo ascii o html - nella mia conoscenza limitata, ed è per questo che cerco aiuto.
Sarei felice con una doppia citazione ASCII, "o"
Il problema seguente è che mi riguarda ci sono altri simboli divertenti decodificati in modo non corretto.
\xe2€™
seguito alcune pitone di riprodurre quello che sto vedendo, seguita dalle cose che ho provato.
import twill
from twill import get_browser
from twill.commands import go
from BeautifulSoup import BeautifulSoup as BSoup
url = 'http://www.coopamerica.org/programs/responsibleshopper/company.cfm?id=271'
twill.commands.go(url)
soup = BSoup(twill.commands.get_browser().get_html())
ps = soup.body("p")
p = ps[52]
>>> p
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe2' in position 22: ordinal not in range(128)
>>> p.string
u'Oxfam International\xe2€™s report entitled \xe2€œOffside!<elided>\r\n'
http://www.fourmilab.ch/webtools/demoroniser/
http://www.crummy.com/software/BeautifulSoup/documentation.html
http://www.cs.tut.fi/~jkorpela/www/windows-chars.html
>>> AsciiDammit.asciiDammit(p.decode())
u'<p>Oxfam International\xe2€™s report entitled \xe2€œOffside!
>>> handle_html_entities(p.decode())
u'<p>Oxfam International\xe2\u20ac\u2122s report entitled \xe2\u20ac\u0153Offside!
>>> unicodedata.normalize('NFKC', p.decode()).encode('ascii','ignore')
'<p>Oxfam International€™s report entitled €œOffside!
>>> htmlStripEscapes(p.string)
u'Oxfam International\xe2TMs report entitled \xe2Offside!
EDIT:
Ho provato con un altro parser BS:
import html5lib
bsoup_parser = html5lib.HTMLParser(tree=html5lib.treebuilders.getTreeBuilder("beautifulsoup"))
soup = bsoup_parser.parse(twill.commands.get_browser().get_html())
ps = soup.body("p")
ps[55].decode()
che mi dà questa
u'<p>Oxfam International\xe2\u20ac\u2122s report entitled \xe2\u20ac\u0153Offside!
migliore dei casi decodifica sembra darmi gli stessi risultati:
unicodedata.normalize('NFKC', p.decode()).encode('ascii','ignore')
'<p>Oxfam InternationalTMs report entitled Offside!
EDIT 2:
Sono in esecuzione Mac OS X 4 con FF 3.0.7 e Firebug
Python 2.5 (wow, non riesco a credere che non ha indicato questo fin dal principio)
che cosa significa "oops voglio dire questo " significare? La tua chiave di backspace non funzionava? –
@ S.Lott: c'è una chiave backspace in mac? – SilentGhost
@SilentGhost: ce n'è uno in ciascuno dei miei mac. Il "oops intendo questo" è molto, molto irritante. Perché non backspace? Cosa c'è di così importante nel ripetere gli stessi personaggi in un markup diverso? È divertente"? –