Python 刮痧罐头';t从h3中提取数据

Python 刮痧罐头';t从h3中提取数据,python,html,python-3.x,scrapy,web-crawler,Python,Html,Python 3.x,Scrapy,Web Crawler,我从Scrapy开始,设法提取了一些我需要的数据。然而,并不是所有的东西都能得到。我正在应用从官方教程中找到的知识,但它不起作用。我在谷歌上搜索了一下,也读了一些,但我相当肯定这不是问题所在 不管怎样,我正试图解析来自的产品信息。我正在尝试获取产品名称、价格、rrp、发布日期、类别、范围、作者和出版商。以下是一个产品的相关CSS:。这是我的密码。所有的东西都有一个#未按预期工作 import scrapy import pprint class ForbiddenPlanetSpider(sc

我从Scrapy开始,设法提取了一些我需要的数据。然而,并不是所有的东西都能得到。我正在应用从官方教程中找到的知识,但它不起作用。我在谷歌上搜索了一下,也读了一些,但我相当肯定这不是问题所在

不管怎样,我正试图解析来自的产品信息。我正在尝试获取产品名称、价格、rrp、发布日期、类别、范围、作者和出版商。以下是一个产品的相关CSS:。这是我的密码。所有的东西都有一个
#未按预期工作

import scrapy
import pprint

class ForbiddenPlanetSpider(scrapy.Spider):
  name = "fp"
  start_urls = [
            'https://forbiddenplanet.com/catalog/?q=mortal%20realms&sort=release-date&page=1',
    ]

  def parse(self, response):
    for item in response.css("section.zshd-00"):
      print(response.css)
      name = item.css("h3.h4::text").get() #!
      price = item.css("span.clr-price::text").get() + item.css("span.t-small::text").get()
      rrp = item.css("del.mqr::text").get()
      release = item.css("dd.mzl").get() #!
      category = item.css("li.inline-list__item::text").get() #!
      universe = item.css("dt.txt").get() #!
      authors = item.css("a.SubTitleItems").get() #!
      publisher = item.css("dd.mzl").get() #!

      pprint.pprint(dict(name=name,
                         price=price,
                         rrp=rrp,
                         release=release,
                         category=category,
                         universe=universe,
                         authors=authors,
                         publisher = publisher
                         )
                    )
我认为我需要添加一些子搜索(例如,目前release和publisher有相同的标准),但我不知道如何用词来搜索它(我已经尝试过了,但最终得到的是一般教程没有涵盖它)。任何能为我指明正确方向的东西都将不胜感激


哦,我没有包含“”空格,因为每当我使用一个Scrapy时,立即找不到。

Scrapy不呈现JS,请尝试刷新页面,对于没有JS的站点版本,HTML结构是不同的

您应该用新的HTML结构重写选择器。尝试使用XPATH而不是CSS,因为它非常灵活

UPD

刮取此网站的最简单方法是请求
https://forbiddenplanet.com/api/products/listing/?q=mortal%20realms&sort=release-日期

响应是一个包含所有必要数据的JSON对象。您可以将“results”字段(或整个JSON对象)转换为python字典,并使用字典方法获取所有字段

一份有效的代码草案,展示了这个想法

import scrapy
import json


def get_tags(tags: list):
    parsed_tags = []
    if tags:
        for tag in tags:
            parsed_tags.append(tag.get('name'))
        return parsed_tags
    return None


class ForbiddenplanetSpider(scrapy.Spider):
    name = 'forbiddenplanet'
    allowed_domains = ['forbiddenplanet.com']
    start_urls = ['https://forbiddenplanet.com/api/products/listing/?q=mortal%20realms&sort=release-date']

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

        for item in items:
            yield {
                'name': item.get('title'),
                'price': item.get('site_price'),
                'rrp': item.get('rrp'),
                'release': item.get('release_date'),
                'category': get_tags(item.get('derived_tags').get('type')),
                'universe': get_tags(item.get('derived_tags').get('universe')),
                'authors': get_tags(item.get('derived_tags').get('author')),
                'publisher': get_tags(item.get('derived_tags').get('publisher')),
            }

        next_page = response_dict.get('next')
        if next_page:
            yield scrapy.Request(
                url=next_page,
                callback=self.parse
            )

Scrapy不呈现JS,尝试刷新页面,没有JS的站点版本的HTML结构不同

您应该用新的HTML结构重写选择器。尝试使用XPATH而不是CSS,因为它非常灵活

UPD

刮取此网站的最简单方法是请求
https://forbiddenplanet.com/api/products/listing/?q=mortal%20realms&sort=release-日期

响应是一个包含所有必要数据的JSON对象。您可以将“results”字段(或整个JSON对象)转换为python字典,并使用字典方法获取所有字段

一份有效的代码草案,展示了这个想法

import scrapy
import json


def get_tags(tags: list):
    parsed_tags = []
    if tags:
        for tag in tags:
            parsed_tags.append(tag.get('name'))
        return parsed_tags
    return None


class ForbiddenplanetSpider(scrapy.Spider):
    name = 'forbiddenplanet'
    allowed_domains = ['forbiddenplanet.com']
    start_urls = ['https://forbiddenplanet.com/api/products/listing/?q=mortal%20realms&sort=release-date']

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

        for item in items:
            yield {
                'name': item.get('title'),
                'price': item.get('site_price'),
                'rrp': item.get('rrp'),
                'release': item.get('release_date'),
                'category': get_tags(item.get('derived_tags').get('type')),
                'universe': get_tags(item.get('derived_tags').get('universe')),
                'authors': get_tags(item.get('derived_tags').get('author')),
                'publisher': get_tags(item.get('derived_tags').get('publisher')),
            }

        next_page = response_dict.get('next')
        if next_page:
            yield scrapy.Request(
                url=next_page,
                callback=self.parse
            )

谢谢,我还没有检查API。它就像一个符咒!谢谢,我还没有检查API。它就像一个符咒!