2017-10-18 18 views
0

クラスを使用してWebデータをスクラップする場合、私はPythonの初心者です。だから、深刻な間違いがあれば事前に謝罪してください。私はwikipediaウェブサイトのaタグを使ってテキストを解析するスクリプトを書いた。私は私のレベルからコードを正確に書こうとしましたが、何らかの理由でコードを実行してエラーをスローします。コードと私が持っているエラーは、あなたの親切な配慮のために以下に与えられます。クラスクローラを実行する際に問題が発生しました

スクリプト:

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() 

エラー:

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 

答えて

1

あなたは次の2行

item = TextParser() 
item.get_text() 

あなたがTextParserを初期化すると、self.storageはなしに等しいを実行しています。関数get_text()を実行すると、それはまだNoneと等しくなります。だからこそ、あなたはその誤りを得るのです。

ただし、次のように変更した場合。 self.storageには、noneではなく文字列が取り込まれます。

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

fetch_urlを呼び出さずに関数get_textを呼び出す場合は、このようにすることができます。

+0

ありがとうございました。ジョナサン、それは今動作します。すぐに回答として受け入れるつもりです。 fetch_url()を呼び出さずにスクレーパーを実行する方法についてのアドバイスを無視しないでください。これが私が最初に試したことです。ありがとうございました。 – shayan

+0

さて、関数get_textでfetch_urlを呼び出すことができます。 – Jonathan

+0

ありがとうございました。これはそれだった。 – shayan

関連する問題