2014-06-24 5 views
4

Je souhaite créer un scraper Web. Actuellement, j'apprends Python. C'est les bases mêmes!Erreur de grattage Web Python - TypeError: impossible d'utiliser un modèle de chaîne sur un objet de type octets

python code

import urllib.request 
import re 

htmlfile = urllib.request.urlopen("http://basketball.realgm.com/") 

htmltext = htmlfile.read() 
title = re.findall('<title>(.*)</title>', htmltext) 

print (htmltext) 

Erreur:

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 

Répondre

5

Vous devez décoder vos données. Depuis le site en question dit

charset=iso-8859-1 

utiliser cela. utf-8 ne fonctionnera pas dans ce cas.

htmltext = htmlfile.read().decode('iso-8859-1') 
+0

Cela a fonctionné, mais je suis encore confus pourquoi nous avons dû mettre un décodage ('iso-8859-1'). Y a-t-il des sites qui ne nécessiteraient pas cette addition? – Jtwa

+1

@Jtwa vérifier le code source du site que vous essayez de gratter pour 'charset = ...'. Pour le site dans votre question, le jeu de caractères est iso-8859-1. Si aucun n'est donné, votre meilleur pari serait habituellement utf-8. – timgeb

3

Utilisation octets littéral comme motif:

title = re.findall(b'<title>(.*)</title>', htmltext) 

ou décoder les données extraites à chaîne:

title = re.findall('<title>(.*)</title>', htmltext.decode('utf-8')) 

(modifiez utf-8 avec l'encodage approprié du document)

Questions connexes