0

このタスクは私の研究に関連しており、python と Scrapy は初めてなので、このタスクを完了するには本当に助けが必要です。

*タスクは、すべての入力フィールド (type=text または password または file ) を選択し、その (id) を、この入力が属するページ リンク以外のバックエンド DB に保存することです *

入力フィールドを選択するための私のコード

def parse_item(self, response):
    self.log('%s' % response.url)

    hxs = HtmlXPathSelector(response)
    item=IsaItem()
    item['response_fld']=response.url

    item['text_input']=hxs.select("//input[(@id or @name) and (@type = 'text' )]/@id ").extract()
    item['pass_input']=hxs.select("//input[(@id or @name) and (@type = 'password')]/@id").extract()
    item['file_input']=hxs.select("//input[(@id or @name) and (@type = 'file')]/@id").extract()

    return item

データベース パイプライン コード:

class SQLiteStorePipeline(object):


def __init__(self):
    self.conn = sqlite3.connect('./project.db')
    self.cur = self.conn.cursor()


def process_item(self, item, spider):
    self.cur.execute("insert into inputs ( input_name) values(?)" , (item['text_input'][0] ), )
    self.cur.execute("insert into inputs ( input_name) values(?)" , (item['pass_input'][0]  ,))
    self.cur.execute("insert into inputs ( input_name) values(?)" ,(item['file_input'][0] ,  ))

    self.cur.execute("insert into links (link) values(?)", (item['response_fld'][0], ))

    self.conn.commit()
    return item

しかし、私はまだこのようなエラーが発生します

self.cur.execute("insert into inputs ( input_name) values(?)" , (item['text_input'][0] ), )
exceptions.IndexError: list index out of range

またはデータベースストアのみ最初の文字!!

Database links table 
 ╔════════════════╗
 ║      links     ║ 
 ╠════════════════╣
 ║  id  │input    ║ 
 ╟──────┼─────────╢
 ║    1 │     t   ║ 
 ╟──────┼─────────╢
 ║    2 │     t   ║ 
 ╚══════╧═════════╝
Note it should "tbPassword" or "tbUsername"

jsonファイルから出力

{"pass_input": ["tbPassword"], "file_input": [], "response_fld":     "http://testaspnet.vulnweb.com/Signup.aspx", "text_input": ["tbUsername"]}
{"pass_input": [], "file_input": [], "response_fld": "http://testaspnet.vulnweb.com/default.aspx", "text_input": []}
{"pass_input": ["tbPassword"], "file_input": [], "response_fld": "http://testaspnet.vulnweb.com/login.aspx", "text_input": ["tbUsername"]}
{"pass_input": [], "file_input": [], "response_fld": "http://testaspnet.vulnweb.com/Comments.aspx?id=0", "text_input": []}
4

2 に答える 2

0

私はこのテクノロジーについて何も知りませんが、これが私の推測です:

insert into inputs ( input_name) values(?)" , (item['text_input'] ) の代わりに 試してください insert into inputs ( input_name) values(?)" , (item['text_input'][0] )

「リストインデックスが範囲外です」エラーについては、アイテムが空のようです。確認する必要があります。

于 2012-07-09T20:18:01.867 に答える
0

IndexErrorリストの最初のアイテムを取得しようとするため、取得しているため、空の場合があります。

私はこのようにします。

くも:

def parse_item(self, response):
    self.log('%s' % response.url)

    hxs = HtmlXPathSelector(response)
    item = IsaItem()
    item['response_fld'] = response.url

    res = hxs.select("//input[(@id or @name) and (@type = 'text' )]/@id ").extract()
    item['text_input'] = res[0] if res else None # None is default value in case no field found

    res = hxs.select("//input[(@id or @name) and (@type = 'password')]/@id").extract()
    item['pass_input'] = res[0] if res else None # None is default value in case no field found

    res = hxs.select("//input[(@id or @name) and (@type = 'file')]/@id").extract()
    item['file_input'] = res[0] if res else None # None is default value in case no field found

    return item

パイプライン:

class SQLiteStorePipeline(object):

    def __init__(self):
        self.conn = sqlite3.connect('./project.db')
        self.cur = self.conn.cursor()


    def process_item(self, item, spider):
        self.cur.execute("insert into inputs ( input_name) values(?)", (item['text_input'],))
        self.cur.execute("insert into inputs ( input_name) values(?)", (item['pass_input'],))
        self.cur.execute("insert into inputs ( input_name) values(?)", (item['file_input'],))

        self.cur.execute("insert into links (link) values(?)", (item['response_fld'],))

        self.conn.commit()
        return item
于 2012-07-10T04:08:05.260 に答える