Scrapy导出无效的json

时间:2013-08-24 06:26:52

标签: python json scrapy

我的解析看起来像这样:

def parse(self, response):
    hxs = HtmlXPathSelector(response)
    titles = hxs.select("//tr/td")
    items = []
    for titles in titles:
        item = MyItem()
        item['title'] = titles.select('h3/a/text()').extract()
        items.append(item)
    return items

为什么输出这样的json:

[{"title": ["random title #1"]},
{"title": ["random title #2"]}]

2 个答案:

答案 0 :(得分:2)

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()

答案 1 :(得分:0)

作为另一个简单的答案,你可以编写一个这样的辅助函数:

def extractor(xpathselector, selector):
    """
    Helper function that extract info from xpathselector object
    using the selector constrains.
    """
    val = xpathselector.select(selector).extract()
    return val[0] if val else None

并将其称为:

item['title'] = extractor(titles, 'h3/a/text()')