sub - regex ejemplos python
TypeError: no se puede usar un patrĂ³n de cadena en un objeto similar a bytes en re.findall() (2)
Estoy tratando de aprender cómo recuperar 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 me sale 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?
Desea convertir html (un objeto de tipo byte) en una cadena usando
.decode
, por ejemplo,
html = response.read().decode(''utf-8'')
.
El problema es que su expresión regular es una cadena, pero
html
es
bytes
:
>>> type(html)
<class ''bytes''>
Dado que python no sabe cómo se codifican esos bytes, genera una excepción cuando intenta utilizar una expresión regular de cadena en ellos.
Puedes
decode
los bytes en una cadena:
html = html.decode(''ISO-8859-1'') # encoding may vary!
title = re.findall(pattern, html) # no more error
O use una expresión regular de bytes:
regex = rb''<title>(,+?)</title>''
# ^
En este contexto particular, puede obtener la codificación de los encabezados de respuesta:
with urllib.request.urlopen(url) as response:
encoding = response.info().get_param(''charset'', ''utf8'')
html = response.read().decode(encoding)
Consulte la
documentación de
urlopen
para más detalles.