Получить пустой массив, если класс содержит пробелы

#python #scrapy #scrapy-shell

#python #scrapy #scrapy-оболочка

Вопрос:

Python 2.7

Я хочу получить URL-адрес и заголовки каждого нового фонового изображения, но я использую xpath, который всегда получает пустой массив при попытке получить URL-адрес изображения.

Вот что я пытаюсь:

 scrapy shell http://www.wownews.tw/fashion/movie
 

и затем

 response.body
 

Я вижу данные html на терминале. Но когда я набираю

 response.xpath('//div[@class="text ng-scope"]')
 

получить пустой массив, я думал, что это должно сработать.

Проблема возникает из-за того, что класс содержит пробелы?

Как это исправить? Любая помощь будет оценена.

Я пробую команду, все равно получаю пустой массив

 response.xpath('//div[contains(concat(" ", normalize-space(@class), " "), "text ng-scope")]')
 

Комментарии:

1. Я вижу ng , и это может означать, что эта страница использует JavaScript для загрузки данных. Откройте браузер, отключите JavaScript и загрузите свою страницу в браузере, чтобы посмотреть, что Scrapy можно увидеть.

2. Я не вижу тегов с классом "text ng-scope" в HTML. Может быть, вы видите это в JavaScript response.body . Есть теги с "text" ( ответом класса.xpath(‘//div[содержит (@class, «text»)]’) ) but not with class «ng-scope» ( response.xpath('//div[contains(@class, "ng-scope")]') ). Как по мне ng-scope , может быть, и нет class , но attribute .

3. Я пытаюсь закрыть javascript и открыть его. Веб-сайт застрянет.

4. Веб-сайт застрял, потому что он не может работать без JavaScript. Насколько я знаю Scrapy , не использует Selenium (вам нужно будет создать project и добавить некоторый код Selenium ), поэтому он не может получить данные, созданные с помощью JavaScript.

5. Спасибо за помощь, я обнаружил, что могу получить данные из их запроса ajax.

Ответ №1:

Здесь есть все, что вам нужно

 import json
import scrapy


class ListingSpider(scrapy.Spider):
    name = 'listing'

    start_urls = ['http://api.wownews.tw/f/pages/site/558fd617913b0c11001d003d?category=5590a6a3f0a8bf110060914damp;children=trueamp;limit=48amp;page=1']

    def parse(self, response):
        items = json.loads(response.body)['results']

        for item in items:
            yield item
 

Обратитесь к https://medium.com/@yashpokar/scrape-any-website-in-the-internet-without-using-splash-or-selenium-68a6c9733369