Невозможно извлечь данные с помощью Scrapy с именем класса, содержащим конечные пробелы

Я пытаюсь использовать scrapy для извлечения данных из Steam о 10 самых популярных играх пользователей, упорядоченных по времени игры. Однако я не могу вывести имя каждой из игр, потому что классы css, содержащие текст имени, имеют конечные пробелы.

Я новичок как в Python, так и в библиотеке Scrapy, поэтому извиняюсь за любые ошибки / плохое форматирование.

Код класса и Python выглядит следующим образом:

Точный код класса

<div class="gameListRowItemName ellipsis ">Counter-Strike: Global Offensive</div> == $0

Код парсера Scrapy

def parse(self, response):

some other code...

return {
    some other code... 
    'gamename': response.css("div.gameListRowItemName.ellipsis ::text").extract()
        
    }

Я обязательно включил .ellipsis, чтобы учесть, что это определение css с несколькими классами, однако я не могу найти, что означает конечное пространство в классе css.

Я попытался использовать несколько различных вариантов div.gameListRowItemName.ellipsis :: text, чтобы попытаться получить доступ к этому тексту (например, .gameListRowItemName :: text), но паук всегда возвращает только пустой список.

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

Кто-нибудь знает, как я могу обойти эту проблему?


person Sam Garrett    schedule 03.09.2019    source источник
comment
Вы пробовали это? response.css (div.gameListRowItemName :: текст)?   -  person Amit    schedule 04.09.2019
comment
По этому == $0 я могу сказать, что вы скопировали HTML из представления DOM вашего веб-браузера. Пожалуйста, убедитесь, что фактический базовый HTML-код содержит тот же HTML-код. Возможно, текст взят из JavaScript. См. docs.scrapy.org/en/latest/topics/dynamic-content .html   -  person Gallaecio    schedule 05.09.2019
comment
Вы были правы, область, которую я пытался очистить, была в разделе ‹script›! Спасибо, что указали мне на документацию по scrapy о том, как с этим бороться, я смогу попробовать это завтра.   -  person Sam Garrett    schedule 06.09.2019


Ответы (1)


Если вы используете селектор css, вы можете просто передать имя первого класса.

from scrapy.selector import Selector
response = Selector(text='<div class="gameListRowItemName ellipsis ">Counter-Strike: Global Offensive</div> == $0')
# with css selectors
print('Css:',response.css("div.gameListRowItemName::text").extract())

# with xpath selectors
print('Xpath:',response.xpath('//*[contains(@class,"gameListRowItemName")]/text()').extract())

Выход

Css: ['Counter-Strike: Global Offensive']
Xpath: ['Counter-Strike: Global Offensive']

Узнайте о css и селекторах xpath xpath в w3schools.

person Amit    schedule 04.09.2019
comment
Спасибо за ответ! Я только что попытался использовать div.gameListRowItemName :: text в моем селекторе css, но я все еще получаю только пустой список в моем выводе (несмотря на запуск вашего тестового кода, чтобы доказать себе, что он должен работать). Есть ли что-то еще, что может быть проблемой? Как я сказал в вопросе, я знаю, что паук правильно обращается к веб-сайту, поскольку он выводит правильное имя пользователя, поэтому я не вижу, что не так. - person Sam Garrett; 04.09.2019
comment
Можете ли вы поделиться своим паучьим кодом? или весь текст ответа. - person Amit; 04.09.2019
comment
Код паука на данный момент только следующий: import scrapy class UserSpider(scrapy.Spider):#CrawlSpider): name = 'users' start_urls = ['https://steamcommunity.com/id/Joe_Blogs/games/?tab=all'] def parse(self, response): yield { 'username': response.css('.whiteLink ::text').extract_first(), 'gamename': response.css('.gameListRowItemName ::text').extract_first() }, а затем веб-сайт - это пример профиля Steam, где я после текста о каждой из перечисленных игр. - person Sam Garrett; 04.09.2019
comment
Ссылка pastebin на код паука для ясности, так как я не понимал, что в комментариях нет разрывов строки: pastebin.com/ cqgYLcTS - person Sam Garrett; 04.09.2019
comment
хорошо, поэтому вам нужно проверить источник страницы. Я вижу, что вы только проверяли dom с помощью Dev Tool. Если вы видите источник страницы (view-source: steamcommunity.com/id/Joe_Blogs/games/?tab=all) вы увидите, что данные загружаются в js. Я предлагаю вам прочитать данные в json и проанализировать. - person Amit; 05.09.2019
comment
Хорошо, молодец, спасибо за помощь! Я сделаю все возможное, чтобы попробовать это завтра и, надеюсь, заставить его работать. - person Sam Garrett; 06.09.2019