Ошибка веб-очистки Python — TypeError: невозможно использовать строковый шаблон для байтоподобного объекта

#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 с соответствующей кодировкой документа)