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
どこが間違っているのか誰かが助けてくれますか?
は素晴らしいアイデアだったが、残念ながらタイプのエラーを得ました。 TypeError: 'str'と 'list'オブジェクトを連結できません。 – Mangohero1
( 'item' "[url]] =" http://en.wikipedia.org "+ title.xpath(" a/@ href " 1つのバグがあります。あなたは以下のようにする必要があります。item ["url"] = "http://ja.wikipedia.org" + title.xpath( "a/@ href")extract()[0] – user2989777
あなたが正しい。それが修正されました。 – acknowledge