problem z pobraniem źródła strony html z polskimi znakami

0

Cześć!

Chciałbym pobrać źródło strony html, która w adresie zawiera polskie znaki. Przykład dla pracuj.pl:

import urllib.request

url = 'https://www.pracuj.pl/praca/sql;kw/Warszawa;wp'

SiteSource = urllib.request.urlopen(url).read()
print(SiteSource)

Zwraca źródło:

b'<!DOCTYPE html> <html prefix="og: http://ogp.me/ns#" xmlns:fb="http://www.facebook.com/2008/fbml"> <head> <meta charset="utf-8"/> (...)

Natomiast, jeżeli tylko zmienię miasto na Poznań:

import urllib.request

url = 'https://www.pracuj.pl/praca/sql;kw/Poznań;wp'

SiteSource = urllib.request.urlopen(url).read()
print(SiteSource)

Otrzymuję błąd:

Traceback (most recent call last):
  File "[PythonProjects]/untitled8/asd.py", line 5, in <module>
    SiteSource = urllib.request.urlopen(url).read()
  File "[PythonLib]\urllib\request.py", line 223, in urlopen
    return opener.open(url, data, timeout)
  File "[PythonLib]\urllib\request.py", line 526, in open
    response = self._open(req, data)
  File "[PythonLib]\urllib\request.py", line 544, in _open
    '_open', req)
  File "[PythonLib]\urllib\request.py", line 504, in _call_chain
    result = func(*args)
  File "[PythonLib]\urllib\request.py", line 1361, in https_open
    context=self._context, check_hostname=self._check_hostname)
  File "[PythonLib]\urllib\request.py", line 1318, in do_open
    encode_chunked=req.has_header('Transfer-encoding'))
  File "[PythonLib]\http\client.py", line 1239, in request
    self._send_request(method, url, body, headers, encode_chunked)
  File "[PythonLib]\http\client.py", line 1250, in _send_request
    self.putrequest(method, url, **skips)
  File "[PythonLib]\http\client.py", line 1117, in putrequest
    self._output(request.encode('ascii'))
UnicodeEncodeError: 'ascii' codec can't encode character '\u0144' in position 23: ordinal not in range(128)

Chciałem to jakoś przekonwertować, ale nie mam sposobu:

url = 'https://www.pracuj.pl/praca/sql;kw/Poznań;wp'
url1 = url.encode('utf-8')
url2 = url.encode('ansi')

print(url1)
print(url2)

Z góry dziękuję za pomoc.

0
from urllib.request import urlopen
from urllib.parse import quote

url = 'https://www.pracuj.pl/praca/sql;kw/Pozna' + quote('ń') + ';wp'
0
enedil napisał(a):

A raczej quote('https://www.pracuj.pl/praca/sql;kw/Poznań;wp')

Też tak pomyślałem, ale niestety odpada, bo w rezultacie otrzymuje:

https%3A//www.pracuj.pl/praca/sql%3Bkw/Pozna%C5%84%3Bwp
Haskell napisał(a):
from urllib.request import urlopen
from urllib.parse import quote

url = 'https://www.pracuj.pl/praca/sql;kw/Pozna' + quote('ń') + ';wp'

quote('ń') odpada, ponieważ Poznań był tylko przykładem - docelowo może się tam znaleźć każde inne miasto.
Ale ponieważ funkcja docelowo ma wyglądać tak:

ListaMiast = []
for miasto in ListaMiast:
url = 'https://www.pracuj.pl/praca/sql;kw/[miasto];wp'

to spróbuję zrobic quote(miasto) i powinno być po problemie. Jutro przetestuję.

Dzieki!

0
gruby19 napisał(a):

quote('ń') odpada, ponieważ Poznań był tylko przykładem - docelowo może się tam znaleźć każde inne miasto.

To był tylko przykład, żeby jasno przedstawić sam zamysł i to co robi metoda quote. W urllib.parse są inne metody pomagające parsować adresy url, warto się z nimi zapoznać:
https://docs.python.org/3/library/urllib.parse.html

1 użytkowników online, w tym zalogowanych: 0, gości: 1