Estou tentando aprender como buscar urls automaticamente em uma página. No código a seguir, estou tentando obter o título da página da 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)
E recebo este erro 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
O que estou fazendo de errado?
python
python-3.x
web-crawler
Inspired_Blue
fonte
fonte
Respostas:
Você deseja converter html (um objeto semelhante a um byte) em uma string usando
.decode
, por exemplohtml = response.read().decode('utf-8')
.Consulte Converter bytes em uma string Python
fonte
TypeError: cannot use a string pattern on a bytes-like object
mas depois recebi erros comoUnicodeDecodeError: 'utf-8' codec can't decode byte 0xb2 in position 1: invalid start byte
..decode("utf-8", "ignore")
utf-16
. Caveat emptor.O problema é que sua regex é uma string, mas
html
é bytes :Como o python não sabe como esses bytes são codificados, ele lança uma exceção quando você tenta usar um regex de string neles.
Você pode converter
decode
os bytes em uma string:Ou use um regex de bytes:
Neste contexto específico, você pode obter a codificação dos cabeçalhos de resposta:
Veja a
urlopen
documentação para mais detalhes.fonte