2016-09-06 6 views
0

Я просто хочу знать, как я могу сделать правило, когда веб-сайт отправляет мне ответ json вместо html? На первом ответе url он дает мне html-ответ, но когда я просматриваю страницы, это дает мне ответ json. Здесь мое правило:Scrapy Json Rule SgmlLink Extractor

Rule(SgmlLinkExtractor(restrict_xpaths=('//div[@class="GridTimeline-items"]'), tags=('div'), 
            attrs=('data-min-position'), allow=(r''), process_value=my_process_value_friends), 
            callback='parse_friends', follow=True), 

Мой вопрос в том, как я могу применить xpath для ответа json?

Спасибо,

+0

Вы должны использовать '' scrapy.linkextractors.Linkextractor' так SgmlLinkExtractor' устаревшим на некоторое время теперь. Эти два, по сути, одно и то же. – Granitosaurus

+0

Спасибо за это :) – Rocky

ответ

0

Вы не можете разобрать JSON с XPath или CSS селекторов. Однако вы можете включить JSON в словарь питона:

import json 
def parse(self, response): 
    data = json.loads(response.body) 
    # then just parse it, e.g. 
    item = dict() 
    item['name'] = data['name'] 
    # ... 

Или вы можете CONVER JSON в XML, а затем разобрать его с Scrapy селекторов. Там много пакетов, которые делают это, но я выделю dicttoxml в моем примере:

import json 
from dicttoxml import dicttoxml 
from scrapy import Selector 
def parse(self, response): 
    data = json.loads(response.body) 
    data_xml = dicttoxml(data) 
    sel = Selector(root=data_xml) 
    # then parse it 
    item = dict() 
    item['name'] = sel.xpath("//name/text()") 
    # ... 
+0

Спасибо, но я ищу решение для правил, а не на этапе синтаксического анализа – Rocky

+0

@Reymark Вы не можете использовать 'restrict_xpath' в источнике json, не расширив работу CrawlSpider. Легкий способ сделать это, хотя, было бы сделать это вручную, как я описал в своем ответе. Просто попробуйте 'parse' callback в LinkExtractor и проверьте, является ли эта страница json в начале, если так найти URL-адреса json, в противном случае продолжить как обычно. – Granitosaurus