titles.select('h3/a/text()').extract()
リストを返すので、リストを取得します。Scrapy は、アイテムの構造について何の仮定も行いません。
簡単な修正は、最初の結果を取得することです。
item['title'] = titles.select('h3/a/text()').extract()[0]
より良い解決策は、アイテム ローダーを使用TakeFirst()
し、出力プロセッサとして使用することです。
from scrapy.contrib.loader import XPathItemLoader
from scrapy.contrib.loader.processor import TakeFirst, MapCompose
class YourItemLoader(XPathItemLoader):
default_item_class = YourItemClass
default_input_processor = MapCompose(unicode.strip)
default_output_processor = TakeFirst()
# title_in = MapCompose(unicode.strip)
そして、そのようにアイテムをロードします:
def parse(self, response):
hxs = HtmlXPathSelector(response)
for title in hxs.select("//tr/td"):
loader = YourItemLoader(selector=title, response=response)
loader.add_xpath('title', 'h3/a/text()')
yield loader.load_item()