Estoy tratando de aprender a buscar automáticamente las URL de una página. En el siguiente código, intento obtener el título de la página 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)
Y recibo este error inesperado:
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é estoy haciendo mal?
python
python-3.x
web-crawler
Inspired_Blue
fuente
fuente
Respuestas:
Quieres convertir html (un objeto similar a un byte) en una cadena usando
.decode
, por ejemplohtml = response.read().decode('utf-8')
.Consulte Convertir bytes en una cadena de Python
fuente
TypeError: cannot use a string pattern on a bytes-like object
pero luego obtuve errores comoUnicodeDecodeError: 'utf-8' codec can't decode byte 0xb2 in position 1: invalid start byte
. Lo arreglé usando.decode("utf-8", "ignore")
: stackoverflow.com/questions/62170614/…utf-16
. Caveat emptor.El problema es que su expresión regular es una cadena, pero
html
son bytes :Dado que Python no sabe cómo se codifican esos bytes, lanza una excepción cuando intenta usar una expresión regular de cadena en ellos.
Puedes convertir
decode
los bytes en una cadena:O use una expresión regular de bytes:
En este contexto particular, puede obtener la codificación de los encabezados de respuesta:
Consulte la
urlopen
documentación para obtener más detalles.fuente