2016-09-28 9 views
0

ScrapyというPythonライブラリを使用して、Wikipedia(特にthis)のWebページを削っています。ここでは、元のコードだった:絶対リンクにScrapyを使用した場合のIndexError

import scrapy 
from wikipedia.items import WikipediaItem 


class MySpider(scrapy.Spider): 
    name = "wiki" 
    allowed_domains = ["en.wikipedia.org/"] 
    start_urls = [ 
     'https://en.wikipedia.org/wiki/Category:2013_films', 
    ] 

    def parse(self, response): 
     titles = response.xpath('//div[@id="mw-pages"]//li') 
     items = [] 
     for title in titles: 
      item = WikipediaItem() 
      item["title"] = title.xpath("a/text()").extract() 
      item["url"] = title.xpath("a/@href").extract() 
      items.append(item) 
     return items 

がターミナルに続いて、私は、JSONファイルにデータを出力するscrapy crawl wiki -o wiki.json -t jsonを走りました。コードが機能している間、 "url"キーに割り当てられたリンクはすべて相対リンクでした。 (すなわち、{"url": ["/wiki/9_Full_Moons"], "title": ["9 Full Moons"]})。代わりに/ウィキ/ 9_Full_Moons

は、私がhttp://en.wikipedia.org/wiki/9_Full_Moonsを必要としていました。そこで、上記のコードを変更して、urljoinをurlparseライブラリからインポートしました。私はまた、代わりにこのように見えるように私のforループを修正:

for title in titles: 
    item = WikipediaItem() 
    url = title.xpath("a/@href").extract() 
    item["title"] = title.xpath("a/text()").extract() 
    item["url"] = urljoin("http://en.wikipedia.org", url[0]) 
    items.append(item) 
return(items) 

私はこれがurlキーは括弧で囲まれているに割り当てられたデータの種類以来の正しいアプローチだと信じていた(右のリストを伴うだろう?)その中の文字列を取得するには、url [0]と入力しました。しかし今回は、次のようなIndexErrorが発生しました。

IndexError: list index out of range

どこが間違っているのか誰かが助けてくれますか?

答えて

0

だからドキュメントhereで与えられた例にコードをミラーリングした後、私が動作するようにコードを取得することができました、the documentation is here

さらに、コードは機能しますが、タイトルとそれぞれのリンクをペアにしません。だから、あなたが

TITLE, TITLE, TITLE, LINK, LINK, LINK

代わり

TITLE, LINK, TITLE, LINK, TITLE, LINK

(後者はおそらくより望ましい結果)を与えるだろう - しかし、それはまた別の問題のためです。誰かが私よりもうまくいく提案された解決策を持っているなら、私はあなたの答えに耳を傾けること以上に喜んでいます!ありがとう。より良い明確にするため

0

urljoinの代わりに2つの文字列を連結することができると思います。 、あなたはxpathメソッドを使用に相対リンクを使用してコードのあなたの最初の繰り返しで

for title in titles: 
    item = WikipediaItem() 
    item["title"] = title.xpath("a/text()").extract() 
    item["url"] = "http://en.wikipedia.org" + title.xpath("a/@href").extract()[0] 
    items.append(item) 
return(items) 
+0

は素晴らしいアイデアだったが、残念ながらタイプのエラーを得ました。 TypeError: 'str'と 'list'オブジェクトを連結できません。 – Mangohero1

+0

( 'item' "[url]] =" http://en.wikipedia.org "+ title.xpath(" a/@ href " 1つのバグがあります。あなたは以下のようにする必要があります。item ["url"] = "http://ja.wikipedia.org" + title.xpath( "a/@ href")extract()[0] – user2989777

+0

あなたが正しい。それが修正されました。 – acknowledge

0

:これを試してみてくださいitem["url"] = title.xpath("a/@href").extract() 返されたオブジェクトは、それが有効になりますインデックス作成、(私は仮定)文字列のリストです。

新しい反復では、メソッドを使用しました。次に、返されたオブジェクトを反復可能として扱いました。url[0]です。上記の例のように、selectメソッドが返すものをチェックしてください。

P .: IPythonはあなたの友人です。誰がどのようにアイテムクラスの作品をさらに明確にする必要がある場合

def parse(self, response): 
    for text in response.xpath('//div[@id="mw-pages"]//li/a/text()').extract(): 
     yield WikipediaItem(title=text) 
    for href in response.xpath('//div[@id="mw-pages"]//li/a/@href').extract(): 
     link = urljoin("http://en.wikipedia.org", href) 
     yield WikipediaItem(url=link) 

+0

申し訳ありません。それは私の間違いでした。それは 'select'ではなく' xpath'とされていました。 'select'メソッドは非難され、動作しません。 – Mangohero1

-1

、私は上記のコード変更しようと思って、

for title in titles: 
    item = WikipediaItem() 
    item["title"] = title.xpath("a/text()").extract() 
    item["url"] = "http://en.wikipedia.org" + title.xpath("a/@href").extract()[0] 
    items.append(item) 
return(items) 
関連する問題