【问题标题】:Unable to extract data using Scrapy with class name containing trailing spaces无法使用包含尾随空格的类名的 Scrapy 提取数据
【发布时间】:2019-09-04 17:22:47
【问题描述】:

我正在尝试使用 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”),但蜘蛛只返回一个空白列表。

我认为蜘蛛中的其他任何地方都没有影响我的输出的问题,因为蜘蛛还会返回正常工作的用户名。

有人知道我该如何解决这个问题吗?

【问题讨论】:

  • 你试过了吗? response.css("div.gameListRowItemName::text")?
  • 我可以从== $0 看出您已经从 Web 浏览器的 DOM 表示中复制了 HTML。请确保实际的底层 HTML 代码包含相同的 HTML 代码。文本可能来自 JavaScript。见docs.scrapy.org/en/latest/topics/dynamic-content.html
  • 你是对的,我试图抓取的区域在

标签: python html css scrapy


【解决方案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']

了解 w3schools 上的 css 和 xpath 选择器 xpath

【讨论】:

  • 感谢您的回复!我刚刚尝试在我的 css 选择器中使用“div.gameListRowItemName::text”,但我的输出中仍然只有一个空白列表(尽管运行您的测试代码向自己证明它应该可以工作)。还有其他可能是问题吗?正如我在问题中所说,我知道蜘蛛可以正确访问网站,因为它确实输出了正确的用户名,所以我看不出有什么问题。
  • 你能分享你的蜘蛛代码吗?或整个响应文本。
  • 蜘蛛代码目前只有这个: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() },然后网站是example steam profile,我在列出每个游戏的文字之后。
  • 为了清晰起见,蜘蛛代码的 pastebin 链接,因为我没有意识到 cmets 没有换行符:pastebin.com/cqgYLcTS
  • 好的,所以你需要检查页面来源。我看到你只是用开发工具检查 dom。如果你看到页面源(view-source:steamcommunity.com/id/Joe_Blogs/games/?tab=all)你会看到数据是在 js 中加载的。我建议你阅读 json 中的数据并解析。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-15
相关资源
最近更新 更多