1

Так что мне удалось создать искатель, и я ищу все ссылки, и когда я прихожу к ссылке на продукт, я делаю некоторые находки, и я беру все продукты информация, но когда дело доходит до определенной страницы он дает ошибку Юникода:/UnicodeError: URL содержит символы, отличные от ASCII (Python 2.7)

import urllib 
import urlparse 
from itertools import ifilterfalse 
from urllib2 import URLError, HTTPError 

from bs4 import BeautifulSoup 

urls = ["http://www.kiabi.es/"] 
visited = [] 


def get_html_text(url): 
    try: 
     return urllib.urlopen(current_url).read() 
    except (URLError, HTTPError, urllib.ContentTooShortError): 
     print "Error getting " + current_url 


def find_internal_links_in_html_text(html_text, base_url): 
    soup = BeautifulSoup(html_text, "html.parser") 
    links = [] 
    for tag in soup.findAll('a', href=True): 
     url = urlparse.urljoin(base_url, tag['href']) 
     domain = urlparse.urlparse(base_url).hostname 
     if domain in url: 
      links.append(url) 
    return links 


def is_url_already_visited(url): 
    return url in visited 


while urls: 
    current_url = urls.pop() 
    word = '#C' 
    if word in current_url: 
     [do sth] 
    #print "Parsing", current_url 
    html_text = get_html_text(current_url) 
    visited.append(current_url) 
    found_urls = find_internal_links_in_html_text(html_text, current_url) 
    new_urls = ifilterfalse(is_url_already_visited, found_urls) 
    urls.extend(new_urls) 

Ошибка:

Traceback (most recent call last): 

File "<ipython-input-1-67c2b4cf7175>", line 1, in <module> 
runfile('S:/Consultas_python/Kiabi.py', wdir='S:/Consultas_python') 

File "C:\Anaconda2\lib\site-packages\spyderlib\widgets\externalshell\sitecustomize.py", line 685, in runfile 
execfile(filename, namespace) 

File "C:\Anaconda2\lib\site-packages\spyderlib\widgets\externalshell\sitecustomize.py", line 71, in execfile 
exec(compile(scripttext, filename, 'exec'), glob, loc) 

File "S:/Consultas_python/Kiabi.py", line 91, in <module> 
html_text = get_html_text(current_url) 

File "S:/Consultas_python/Kiabi.py", line 30, in get_html_text 
return urllib.urlopen(current_url).read() 

File "C:\Anaconda2\lib\urllib.py", line 87, in urlopen 
return opener.open(url) 

File "C:\Anaconda2\lib\urllib.py", line 185, in open 
fullurl = unwrap(toBytes(fullurl)) 

File "C:\Anaconda2\lib\urllib.py", line 1070, in toBytes 
" contains non-ASCII characters") 

UnicodeError: URL u'http://www.kiabi.es/Barbapap\xe1_s1' contains non-ASCII characters 

или

UnicodeError: URL u'http://www.kiabi.es/Petit-B\xe9guin_s2' contains non-ASCII characters 

Как я могу это исправить?

ответ

0

Вы можете попытаться кодировать URL-адреса. Ваш код может выглядеть следующим образом:

def get_html_text(url): 
    try: 
     return urllib.urlopen(current_url.encode('ascii','ignore')).read() 
    except (URLError, HTTPError, urllib.ContentTooShortError): 
     print "Error getting " + current_url 
3

Вы должны процентов закодировать utf8 представления вашего Юникода строки.

Как объяснено here:

All non-ASCII code points in the IRI should next be encoded as UTF-8, and the resulting bytes percent-encoded, to produce a valid URI.

В Python коде, это означает, что:

import urllib 
url = urllib.quote(url.encode('utf8'), ':/') 

Второго аргумент quote, ':/', заключается в предотвращении толстой кишки в протокольной части http:, или пути разделитель / от кодирования.

+0

Я продолжаю иметь такую ​​же проблему с этим адресом: http://www.kiabi.es/vestidos-cortos-mujer_201708?pn=0, я попробовал url = "http://www.kiabi.es/vestidos- cortos-mujer_201708? pn = 0 " html = urllib.urlopen (url.encode ('ascii', 'ignore')). read() и url =" http://www.kiabi.es/vestidos-cortos- mujer_201708? pn = 0 " url = urllib.quote (url.encode ('utf8'), ': /') html = urllib.urlopen (url) .read() и не работает –

+0

Какая ошибка вы получаете? Кроме того, будьте осторожны: 1. В образце 'url' doen't есть символ юникода, поэтому кодировка не требуется, 2.' urllib.quote' также кодирует символ '?', Который, вероятно, вы не хотите кодировать. – memoselyk