Chcę wydrukować kod źródłowy strony internetowej, ale polecenie Python Drukuj po prostu wydrukuje pustą przestrzeń i myślę, że to ze względu na jego duży rozmiar. Czy jest jakiś sposób na drukowanie kodu źródłowego strony w skorupce lub na liście w pliku? Próbowałem drukować w pliku, ale wystąpił ten błąd:

UnicodeEncodeError: 'charmap' codec can't encode character '\u06cc' in position 11826: character maps to <undefined>

Jak mogę to naprawić?

import urllib.request
response = urllib.request.urlopen('http://www.farsnews.com')
html = response.read()

print(html)#prints empty space! 

hf=open('test.txt','w')
a=str(html,'utf-8')
hf.write(a)
hf.close()

Python łatwo drukuje a[0:1000], ale dla a[0:len(a)], jak powiedziałem pustą przestrzeń!

3
hamidfzm 30 listopad 2013, 14:24

2 odpowiedzi

Najlepsza odpowiedź

Właśnie próbowałem tego samego na Win7 za pomocą Pythona 3.2.5 i oto co mam:

Python 3.2.5 (default, May 15 2013, 23:07:10) [MSC v.1500 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> from urllib import request
>>> r = request.urlopen("http://www.farsnews.com")
>>> bytecode = r.read()
>>> htmlstr = bytecode.decode()
>>> print(bytecode)

Drukowanie bytecode działa dobrze, ponieważ drukuje zakodowane reprezentacje dla znaków Unicode, ale drukowanie htmlstr podnosi UnicodeDecodeError W systemie Windows, ponieważ niektóre znaki nie mogą być drukowane za pomocą bieżących lokalizacji Domyślne kodowanie (Windows 'cmd.exe nie jest Unicode)

W moim przypadku użytego kodowania było 'cp866', jak widziałem go w Traceback.

Domyślnie PY3K korzysta z kodowania 'utf-8' do przechowywania danych ciągu i jeśli chcesz go zastąpić, należy wyraźnie określić kodowanie do użycia do dekodowania

Więc oto obejście pobytu:

>>> safe_str = bytecode.decode(encoding='cp866', errors='ignore')
>>> print(safe_str)

Właściwie to jest odpowiednik

>>> safe_str = str(bytecode, encoding='cp866', errors='ignore')
>>> print(safe_str)

Drugi parametr errors mówi, czy błąd powinien być różany, gdy Kodowanie, którego próbujesz użyć, nie może dekodować konkretnego znaku

3
ustinov 3 grudzień 2013, 15:05

Po prostu to zrobiłem

import requests
page = requests.get(url)
print (page.text.encode('utf8'))

Jeśli skrobasz strony internetowe z Pythonem, to jest To niesamowity start punkt. Polecam też, aby wyglądać na piękną część (kolejna metoda analizowania HTML).

0
gariepy 2 czerwiec 2016, 15:36