validar sub regulares python3 para metacaracter impacientes fechas expresiones example ejemplos python python-3.x web-crawler

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?



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.