json
  • web-scraping
  • scrapy
  • 2017-01-31 3 views 0 likes 
    0

    Я обрабатываю запрос json, который имеет div как значение. Теперь я хочу, чтобы получить только значение данных-контент стоимостиScrapy Extract Значения тегов

    <li id="term_100800962" data-content-value='{"nl_term_id":100800962,"c_price_from":33415,"nd_price_discount":0,"nl_tour_id":1017864,"nl_hotel_id":[49316],"d_start":"2017-04-12","d_end":"2017-04-17"}' > 
    

    и хранить их в «даты» «ид» «цене» и я не могу найти способ сделать это.

    Есть ли простой способ?

    ответ

    1
    In [2]: from scrapy.selector import Selector 
    
    In [3]: text = """<li id="term_100800962" data-content-value='{"nl_term_id":100 
        ...: 800962,"c_price_from":33415,"nd_price_discount":0,"nl_tour_id":1017864," 
        ...: nl_hotel_id":[49316],"d_start":"2017-04-12","d_end":"2017-04-17"}' >""" 
    
    In [4]: sel = Selector(text=text) 
    
    In [5]: data_string = sel.xpath('//li/@data-content-value').extract_first() 
    
    In [6]: import json 
    
    In [7]: json.loads(data_string) 
    Out[7]: 
    {'c_price_from': 33415, 
    'd_end': '2017-04-17', 
    'd_start': '2017-04-12', 
    'nd_price_discount': 0, 
    'nl_hotel_id': [49316], 
    'nl_term_id': 100800962, 
    'nl_tour_id': 1017864} 
    

    Во-первых, получить строку атрибута, а затем использовать json.loads() преобразовать его в питон Dict.

    Этот URL возвращает ответ JSON, мы должны все грузы ответ JSON и выбрать информацию, нам нужно:

    In [11]: fetch('https://dovolena.invia.cz/direct/tour_search/ajax-next-boxes/?nl 
    ...: _country_id%5B0%5D=28&nl_locality_id%5B0%5D=19&d_start_from=23.01.2017& 
    ...: d_end_to=19.04.2017&nl_transportation_id%5B0%5D=3&sort=nl_sell&page=1&g 
    ...: etOptionsCount=true&base_url=https%3A%2F%2Fdovolena.invia.cz%2F') 
    
    In [12]: j = json.loads(response.text) 
    In [15]: j['boxes_html'] # this will renturn the html in json file. 
    In [15]: from scrapy.selector import Selector 
    
    In [16]: sel = Selector(text=j['boxes_html']) # loads html to selector 
    
    In [17]: datas = sel.xpath('//li/@data-content-value').extract() # return all data in a list 
    In [21]: [json.loads(d) for d in datas] # loads text to value 
          |---dict-----| 
    # this will return a list of dict which generated by json.loads(d), and you can use json.loads(d)['d_end'] to access it's element. 
    

    из:

    [{'c_price_from': 15690, 
        'd_end': '2017-04-16', 
        'd_start': '2017-04-09', 
        'nd_price_discount': 27, 
        'nl_hotel_id': [24810], 
        'nl_term_id': 93902083, 
        'nl_tour_id': 839597}, 
    {'c_price_from': 27371, 
        'd_end': '2017-04-17', 
        'd_start': '2017-04-12', 
        'nd_price_discount': 4, 
        'nl_hotel_id': [49316], 
        'nl_term_id': 100804770, 
        'nl_tour_id': 1017864}, 
    {'c_price_from': 32175, 
        'd_end': '2017-04-17', 
        'd_start': '2017-04-12', 
        'nd_price_discount': 4, 
        'nl_hotel_id': [49316], 
        'nl_term_id': 100800962, 
        'nl_tour_id': 1017864}, 
    
    +0

    Я получаю сообщение об ошибке, когда я пытаясь это. – Kostas

    +0

    Я был бы очень рад, если бы вы могли помочь мне, это кодирование, которое работает в scrapy shell [link] (http://pastebin.com/MYuER5xf) – Kostas

    +0

    Хорошо проверить последнюю ошибку, я думаю, столкнулся. Я написал выше, что хочу хранить отдельно, но это не позволяет мне. Я думаю, что это последний шаг, извините за мое недопонимание. [link] (http://imgur.com/a/brMVq) – Kostas

    Смежные вопросы