J'essaie d'apprendre à récupérer automatiquement les URL d'une page. Dans le code suivant, j'essaie d'obtenir le titre de la page Web:
import urllib.request
import re
url = "http://www.google.com"
regex = r'<title>(,+?)</title>'
pattern = re.compile(regex)
with urllib.request.urlopen(url) as response:
html = response.read()
title = re.findall(pattern, html)
print(title)
Et j'obtiens cette erreur inattendue:
Traceback (most recent call last):
File "path\to\file\Crawler.py", line 11, in <module>
title = re.findall(pattern, html)
File "C:\Python33\lib\re.py", line 201, in findall
return _compile(pattern, flags).findall(string)
TypeError: can't use a string pattern on a bytes-like object
Qu'est-ce que je fais mal?
python
python-3.x
web-crawler
Inspiré_Bleu
la source
la source
Réponses:
Vous voulez convertir html (un objet de type octet) en une chaîne en utilisant
.decode
, par exemplehtml = response.read().decode('utf-8')
.Voir Convertir des octets en une chaîne Python
la source
TypeError: cannot use a string pattern on a bytes-like object
mais j'ai eu des erreurs commeUnicodeDecodeError: 'utf-8' codec can't decode byte 0xb2 in position 1: invalid start byte
. Je l'ai corrigé en utilisant.decode("utf-8", "ignore")
: stackoverflow.com/questions/62170614/…utf-16
. Caveat emptor.Le problème est que votre regex est une chaîne, mais
html
est octets :Puisque python ne sait pas comment ces octets sont encodés, il lève une exception lorsque vous essayez d'utiliser une chaîne regex sur eux.
Vous pouvez soit
decode
les octets en une chaîne:Ou utilisez une expression régulière d'octets:
Dans ce contexte particulier, vous pouvez obtenir le codage à partir des en-têtes de réponse:
Consultez la
urlopen
documentation pour plus de détails.la source