2016-11-20 31 views
0

私はPythonでプログラミングして、scrapyで作業するのが初めてです。 私はWebページをクロールしてから、コレクションをmongoDBに保存しています。私は、Webクローリングのエラーに直面しています。 私はこのサイトで同様のヘルプページを使用しており、初めから最後まで無駄にチュートリアルをたどりましたが、何か助けになるでしょう。Scrapy Spiderのエラー処理

from scrapy.item import Item, Field 

#class 1 
class StackItem(Item): 
# define the fields for your item here like: 
# name = scrapy.Field() 
pagetitle = Field() 
newsmain = Field() 
pass 

from scrapy import Spider 
from scrapy.selector import Selector 
from stack.items import StackItem 

#class 2 
class StackSpider(Spider): 
name = "stack" 
allowed_domains = ["docs.python.org"] 
start_urls = ["https://docs.python.org/2/howto/curses.html",] 

def parse(self, response): 
    information = Selector(response.body).xpath('//div[@class="section"]') 

    for data in information: 
     item = StackItem() 
     item['pagetitle'] = data.information('//*[@id="curses-programming- with-python"]').extract() 
     item['newsmain'] = data.information('//*[@id="what-is- curses"]').extract() 

    yield item 
+0

コード貼り付けのインデントを修正できますか? –

答えて

0

scrapy.selector.Selector.__init__()expects a Response object as first argument

This is the error i'm getting from terminal, Spider error processing

は、ここに私のコードです。

あなたはHTTPレスポンスボディのためのセレクタを構築したい場合は、text=引数を使用します。

$ scrapy shell https://docs.python.org/2/howto/curses.html 
2016-11-21 11:05:34 [scrapy] INFO: Scrapy 1.2.1 started (bot: scrapybot) 
(...) 
2016-11-21 11:05:35 [scrapy] INFO: Spider opened 
2016-11-21 11:05:35 [scrapy] DEBUG: Crawled (200) <GET https://docs.python.org/2/howto/curses.html> (referer: None) 
(...) 
>>> 
>>> # 
>>> # passing response.body (bytes) instead of a Response object fails 
>>> # 
>>> scrapy.Selector(response.body) 
Traceback (most recent call last): 
    File "<console>", line 1, in <module> 
    File "/home/paul/.virtualenvs/scrapy12/local/lib/python2.7/site-packages/scrapy/selector/unified.py", line 67, in __init__ 
    text = response.text 
AttributeError: 'str' object has no attribute 'text' 
>>> 
>>> # 
>>> # use text= argument to pass response body 
>>> # 
>>> scrapy.Selector(text=response.body) 
<Selector xpath=None data=u'<html xmlns="http://www.w3.org/1999/xhtm'> 
>>> 
>>> scrapy.Selector(text=response.body).xpath('//div[@class="section"]') 
[<Selector xpath='//div[@class="section"]' data=u'<div class="section" id="curses-programm'>, <Selector xpath='//div[@class="section"]' data=u'<div class="section" id="what-is-curses"'>, <Selector xpath='//div[@class="section"]' data=u'<div class="section" id="the-python-curs'>, <Selector xpath='//div[@class="section"]' data=u'<div class="section" id="starting-and-en'>, <Selector xpath='//div[@class="section"]' data=u'<div class="section" id="windows-and-pad'>, <Selector xpath='//div[@class="section"]' data=u'<div class="section" id="displaying-text'>, <Selector xpath='//div[@class="section"]' data=u'<div class="section" id="attributes-and-'>, <Selector xpath='//div[@class="section"]' data=u'<div class="section" id="user-input">\n<h'>, <Selector xpath='//div[@class="section"]' data=u'<div class="section" id="for-more-inform'>] 
>>> 

を簡単な方法は、直接応答オブジェクトを渡すことです:

>>> scrapy.Selector(response).xpath('//div[@class="section"]') 
[<Selector xpath='//div[@class="section"]' data=u'<div class="section" id="curses-programm'>, <Selector xpath='//div[@class="section"]' data=u'<div class="section" id="what-is-curses"'>, <Selector xpath='//div[@class="section"]' data=u'<div class="section" id="the-python-curs'>, <Selector xpath='//div[@class="section"]' data=u'<div class="section" id="starting-and-en'>, <Selector xpath='//div[@class="section"]' data=u'<div class="section" id="windows-and-pad'>, <Selector xpath='//div[@class="section"]' data=u'<div class="section" id="displaying-text'>, <Selector xpath='//div[@class="section"]' data=u'<div class="section" id="attributes-and-'>, <Selector xpath='//div[@class="section"]' data=u'<div class="section" id="user-input">\n<h'>, <Selector xpath='//div[@class="section"]' data=u'<div class="section" id="for-more-inform'>] 

とにもあなたの応答がHtmlResponseまたはXmlResponse(通常はウェブスクレイピングの場合)であれば.xpath() method on the response instanceを使用することです(セレクタを作成する便利な方法です)

>>> response.xpath('//div[@class="section"]') 
[<Selector xpath='//div[@class="section"]' data=u'<div class="section" id="curses-programm'>, <Selector xpath='//div[@class="section"]' data=u'<div class="section" id="what-is-curses"'>, <Selector xpath='//div[@class="section"]' data=u'<div class="section" id="the-python-curs'>, <Selector xpath='//div[@class="section"]' data=u'<div class="section" id="starting-and-en'>, <Selector xpath='//div[@class="section"]' data=u'<div class="section" id="windows-and-pad'>, <Selector xpath='//div[@class="section"]' data=u'<div class="section" id="displaying-text'>, <Selector xpath='//div[@class="section"]' data=u'<div class="section" id="attributes-and-'>, <Selector xpath='//div[@class="section"]' data=u'<div class="section" id="user-input">\n<h'>, <Selector xpath='//div[@class="section"]' data=u'<div class="section" id="for-more-inform'>] 
+0

@paultmbrth返信ありがとう私はあなたの提案を今試してみることにしました。また、インデントに問題があったことを認識しませんでした。次回のメモを取るでしょう – Daniel

+0

私はちょうど提案を試みました。もしあなたができれば、私の最後からの不具合、あなたは、私がこの作業をするために元のコードに加えなければならない変更について何か提案していますか?...あなたがシェルを使用しているのを見て、私は_curses importerrorに苦しんでいます – Daniel