Как извлечь текст с помощью Xpath в Scrapy?

Хорошо, кажется, я перепробовал все и просто не могу понять, что здесь происходит. Прямая ссылка на сайт, который я пытаюсь получить, — http://www.ammofast.com/collections/pistol/products/aguila-25-auto-acp-full-metal-jacket-50-gr.-1000-раунд-футляр

И я хочу извлечь название и цену. Мои лучшие попытки просто возвращают пустой []

User-Ps-MacBook-Pro:ammo user$ scrapy shell "http://www.ammofast.com/collections/pistolproducts/aguila-25-auto-acp-full-metal-jacket-50-gr-1000-round-case"
...
>>> response.xpath('//div[@id="product-header-title"]/h1[@id="product-title"]/text()').extract
<bound method SelectorList.extract of []>

Я пробовал несколько разных вариантов, но все безрезультатно. Наверное, я еще не до конца понимаю структуру XPath, но именно поэтому я практикуюсь :) Спасибо за помощь! Я тоже на Scrapy 1.1.0.


person Mxracer888    schedule 02.06.2016    source источник


Ответы (1)


Цена загружается с помощью Javascript, в исходнике видно:

window.ShopifyAnalytics.lib.track(
          "Viewed Product",
          {"id":705964349,"name":"Aguila .25 Auto ACP Full Metal Jacket 50 Gr 1000 Round Case - 1000 \/ 50","price":"329.99","currency":"USD","sku":"","brand":"Aguila","category":".25 ACP","nonInteraction":true}
        );

            });

Если вы посмотрите на возвращенный источник, вы увидите, что на самом деле в p class="price" нет текста:

 <div id="purchase">
                <p class="price"></p>                                 
                <input class="btn" type="submit" name="add" id="add-to-cart" value="Add to Cart" />
              </div>

            </div><!-- /.options -->

Что вы можете сделать, так это проанализировать этот код функции или получить цену из тега опции:

In [15]: response.xpath("//*[@id='product-title']/text()")
Out[15]: [<Selector xpath="//*[@id='product-title']/text()" data=u'Aguila .25 Auto ACP Full Metal Jacket 50'>]

In [16]: response.xpath("//option/text()")
Out[16]:  [<Selector xpath="//*[@id='product-select']/option/text()" data=u'1000 / 50 - $329.99'>]
person Padraic Cunningham    schedule 02.06.2016
comment
Хорошо, теперь мне интересно, это проблема с моими настройками или что-то в этом роде? Потому что я только что скопировал оба ваших ввода, и все, что возвращается, это [ ] больше ничего не говорит. - person Mxracer888; 02.06.2016
comment
Если вы посмотрите, что возвращает response.body, что вы увидите? - person Padraic Cunningham; 02.06.2016
comment
Вот что получается (codeshare.io/wm9vt). Я попытался немного приукрасить его с помощью веб-сайта. а затем поместите его на код-шеринг, чтобы выглядеть немного лучше. Там довольно много JS, единственным реальным HTML, кажется, являются панели навигации, нижний колонтитул и некоторые вещи типа «шаблона», которые я предполагаю. Если вы попытаетесь просто нажать ctrl + F и выполнить поиск любых div или h1, он ничего не найдет, поэтому я просто JS - это то, что извлекает эту информацию? - person Mxracer888; 02.06.2016
comment
Хорошо, то, что вы получаете, и то, как выглядит источник, не совпадают. Я вижу Page Not Found в заголовке, где, если вы посмотрите на исходный код в браузере, щелкнув правой кнопкой мыши и выбрав источник, вы увидите, что его нет. Вы уверены, что используете правильный URL? - person Padraic Cunningham; 02.06.2016
comment
Верно. И когда я пытался очистить заголовок xpath, он вернул страницу не найдена. Итак, есть ли способ для Scrapy отображать Javascript? - person Mxracer888; 02.06.2016
comment
Я получаю response.xpath("//title").extract_first() -> u'<title>Aguila .25 Auto ACP Full Metal Jacket 50 Gr 1000 Round Case | AmmoFast.com</title>', да, вы можете использовать scrapy-splash github.com/scrapy-plugins/scrapy-splash но вы можете получить данные без загрузки js, но есть еще кое-что, что вам нужно исправить. Попробуйте scrapy shell -s USER_AGENT="Mozilla/5.0 (X11; Linux x86_64)" "http://www.ammofast.com/collections/pistol/products/aguila-25-auto-acp-full-metal-jacket-50-gr-1000-round-case" - person Padraic Cunningham; 02.06.2016
comment
Хорошо, теперь я чувствую себя тупым, ха-ха, я думал, что проверял это несколько раз, но, похоже, нет. Когда я вошел в оболочку и вставил URL-адрес, мне почему-то не хватило / в URL-адресе, чтобы сделать его пистолетом/продуктами. Нам хорошо сейчас! :) - person Mxracer888; 02.06.2016
comment
лол, я скопировал ссылку, а не ваш код, так как предполагал, что вы сделали то же самое! В любом случае у вас была бы проблема с ценой, так что двух зайцев одним выстрелом :) - person Padraic Cunningham; 02.06.2016