#python-3.x #web-scraping #scraper #findall
#python-3.x #веб-очистка #scraper #найти все
Вопрос:
Я хочу создать веб-скребок. В настоящее время я изучаю Python. Это самые основы!
Код Python
import urllib.request
import re
htmlfile = urllib.request.urlopen("http://basketball.realgm.com/")
htmltext = htmlfile.read()
title = re.findall('<title>(.*)</title>', htmltext)
print (htmltext)
Ошибка:
File "C:Python33libre.py", line 201, in findall
return _compile(pattern, flags).findall(string)
TypeError: can't use a string pattern on a bytes-like object
Ответ №1:
Вы должны декодировать свои данные. Поскольку на рассматриваемом веб-сайте говорится
charset=iso-8859-1
используйте это. utf-8 в этом случае работать не будет.
htmltext = htmlfile.read().decode('iso-8859-1')
Комментарии:
1. Это сработало, но я все еще не понимаю, почему мы должны были ввести decode(‘iso-8859-1’). Существуют ли сайты, которые не требуют такого добавления?
2. @Jtwa проверьте исходный код сайта, который вы пытаетесь очистить
charset=...
. Для сайта в вашем вопросе используется кодировка iso-8859-1. Если ничего не указано, лучшим выбором обычно будет utf-8.
Ответ №2:
Используйте байтовый литерал в качестве шаблона:
title = re.findall(b'<title>(.*)</title>', htmltext)
или декодировать полученные данные в строку:
title = re.findall('<title>(.*)</title>', htmltext.decode('utf-8'))
(изменить utf-8
с соответствующей кодировкой документа)