2017-10-18 4 views
0

Je suis complètement novice avec python quand il s'agit de récupérer des données Web en classe. Donc, excuses d'avance pour toute erreur grave. J'ai écrit un script pour analyser le texte à l'aide de la balise a du site Web wikipedia. J'ai essayé d'écrire le code avec précision à partir de mon meilleur niveau, mais pour une raison quelconque, quand j'exécute le code, il jette une erreur. Le code et l'erreur que j'ai sont donnés ci-dessous pour votre aimable considération.Problème lors de l'exécution de mon crawler de classe

Le script:

import requests 
from lxml.html import fromstring 

class TextParser(object): 

    def __init__(self): 
     self.link = 'https://en.wikipedia.org/wiki/Main_Page' 
     self.storage = None 

    def fetch_url(self): 
     self.storage = requests.get(self.link).text 

    def get_text(self): 
     root = fromstring(self.storage) 
     for post in root.cssselect('a'): 
      print(post.text) 

item = TextParser() 
item.get_text() 

L'erreur:

Traceback (most recent call last): 
    File "C:\Users\mth\AppData\Local\Programs\Python\Python35-32\testmatch.py", line 38, in <module> 
    item.get_text() 
    File "C:\Users\mth\AppData\Local\Programs\Python\Python35-32\testmatch.py", line 33, in get_text 
    root = fromstring(self.storage) 
    File "C:\Users\mth\AppData\Local\Programs\Python\Python35-32\lib\site-packages\lxml\html\__init__.py", line 875, in fromstring 
    is_full_html = _looks_like_full_html_unicode(html) 
TypeError: expected string or bytes-like object 

Répondre

1

Vous êtes en train d'exécuter les deux lignes suivantes

item = TextParser() 
item.get_text() 

Lorsque vous initialisez TextParser, self.storage est égal à Aucun. Lorsque vous exécutez la fonction get_text(), elle est toujours égale à None. Voilà pourquoi vous obtenez cette erreur.

Toutefois, si vous modifiez le suivant. doit être rempli avec une chaîne plutôt que d'être aucun.

item = TextParser() 
item.fetch_url() 
item.get_text() 

Si vous voulez appeler la fonction get_text sans appeler fetch_url, vous pouvez le faire de cette façon.

+0

Merci monsieur Jonathan, ça marche maintenant. Va l'accepter comme une réponse bientôt. S'il vous plaît, n'ignorez pas le fait de donner des conseils sur la façon dont je peux exécuter le scraper sans appeler 'fetch_url()'. C'est ce que j'ai essayé en premier lieu. Merci et très obligé. – shayan

+0

Eh bien, vous pouvez appeler fetch_url dans la fonction get_text. – Jonathan

+0

Merci beaucoup. C'était ça. – shayan