Próbuję zeskrobać stronę internetową, ale pojawia się błąd.
Używam następującego kodu:
import urllib.request
from bs4 import BeautifulSoup
get = urllib.request.urlopen("https://www.website.com/")
html = get.read()
soup = BeautifulSoup(html)
print(soup)
I pojawia się następujący błąd:
File "C:\Python34\lib\encodings\cp1252.py", line 19, in encode
return codecs.charmap_encode(input,self.errors,encoding_table)[0]
UnicodeEncodeError: 'charmap' codec can't encode characters in position 70924-70950: character maps to <undefined>
Co mogę zrobić, aby to naprawić?
python
beautifulsoup
urllib
SstrykerR
źródło
źródło
Naprawiłem to, dodając
.encode("utf-8")
dosoup
.To znaczy, że
print(soup)
się stanieprint(soup.encode("utf-8"))
.źródło
bytes
obiektu, który wydrukuje jako bałagan\x
sekwencji, jeśli jest dużo tekstu zakodowanego w UTF-8. Polecam używaniewin_unicode_console
, jak sugeruje @JFSebastian.b'\x02x\xc2\xa9'
zamiast tego jest drukowany (obiekt bajtów)print(soup.encode("utf-8"))
pracował dla mnie, ale wcześniej musiałem również dodaćwith open("f_name", encoding="utf-8") as f: soup = BeautifulSoup(f, "html.parser")
W Pythonie 3.7 i systemie Windows 10 to działało (nie jestem pewien, czy będzie działać na innych platformach i / lub innych wersjach Pythona)
Zastępując ten wiersz:
with open('filename', 'w') as f:
Z tym:
with open('filename', 'w', encoding='utf-8') as f:
Powodem, dla którego działa, jest to, że kodowanie zmienia się na UTF-8 podczas korzystania z pliku, więc znaki w UTF-8 można konwertować na tekst, zamiast zwracać błąd, gdy napotka znak UTF-8, który jest nie suppord przez obecne kodowanie.
źródło
Podczas zapisywania odpowiedzi na żądanie get ten sam błąd został zgłoszony w Pythonie 3.7 w oknie 10. Odpowiedź otrzymana z adresu URL, kodowanie to UTF-8, więc zawsze zaleca się sprawdzenie kodowania, aby można było przekazać to samo, aby uniknąć tak trywialnego problemu ponieważ naprawdę zabija dużo czasu w produkcji
Kiedy dodałem kodowanie = "utf-8" za pomocą polecenia open, zapisałem plik z poprawną odpowiedzią
źródło
Nawet ja napotkałem ten sam problem z kodowaniem, który występuje, gdy próbujesz go wydrukować, odczytać / zapisać lub otworzyć. Jak wspomniano powyżej, dodanie .encoding = "utf-8" pomoże, jeśli spróbujesz go wydrukować.
Jeśli próbujesz otworzyć zeskrobane dane i być może zapisać je w pliku, otwórz plik za pomocą (......, encoding = "utf-8")
źródło
Dla tych, którzy nadal otrzymują ten błąd, dodanie
encode("utf-8")
gosoup
również to naprawi.źródło
soup
BeautifulSoup
po wykonaniu tej czynności nie jest już obiektem, więc nie można nim manipulować ani wyszukiwać