Python 刮擦

Python 刮擦,python,web-scraping,scrapy,screen-scraping,scrapy-spider,Python,Web Scraping,Scrapy,Screen Scraping,Scrapy Spider,我试图用scrapy更深入地挖掘,但只能得到我正在刮的东西的标题,而不能得到任何细节。以下是我目前掌握的代码: from scrapy.spider import BaseSpider from scrapy.selector import HtmlXPathSelector from tcgplayer1.items import Tcgplayer1Item class MySpider(BaseSpider): name = "tcg" allowed_domains =

我试图用scrapy更深入地挖掘,但只能得到我正在刮的东西的标题,而不能得到任何细节。以下是我目前掌握的代码:

from scrapy.spider import BaseSpider
from scrapy.selector import HtmlXPathSelector
from tcgplayer1.items import Tcgplayer1Item

class MySpider(BaseSpider):
    name = "tcg"
    allowed_domains = ["http://www.tcgplayer.com/"]
    start_urls = ["http://store.tcgplayer.com/magic/journey-into-nyx?PageNumber=1"]

    def parse(self, response):
        hxs = HtmlXPathSelector(response)
        titles = hxs.select("//div[@class='magicCard']")
        vendor = hxs.select("//tr[@class='vendor']")
        items = []

        for titles in titles:
            item = Tcgplayer1Item()
            item ["cardname"] = titles.select("//li[@class='cardName']/a/text()").extract()
            item ["price"] = vendor.select("//td[@class='price']/br/text()").extract()
            item ["quantity"] = vendor.select("//td[@class='quantity']/td/text()").extract()
            items.append(item)
        return items

我无法获得显示任何结果的价格和数量。每张卡都有几个供应商,每个供应商都有自己的价格和数量。我想这就是我的问题所在。任何帮助都将不胜感激

首先,你可以改变

item ["price"] = vendor.select("//td[@class='price']/br/text()").extract()
item ["quantity"] = vendor.select("//td[@class='quantity']/td/text()").extract()
致:

这将确保您只获得所需卡的价格和数量行

您可能还需要从选择器中删除/br和/td,因此您的代码如下所示:

item ["price"] = titles.select("//td[@class='price']/text()").extract()
item ["quantity"] = titles.select("//td[@class='quantity']/text()").extract()

首先,下面是代码的固定版本:

from scrapy.spider import BaseSpider
from scrapy.selector import Selector
from tcgplayer1.items import Tcgplayer1Item


class MySpider(BaseSpider):
    name = "tcg"
    allowed_domains = ["http://www.tcgplayer.com/"]
    start_urls = ["http://store.tcgplayer.com/magic/journey-into-nyx?PageNumber=1"]

    def parse(self, response):
        hxs = Selector(response)
        titles = hxs.xpath("//div[@class='magicCard']")
        for title in titles:
            item = Tcgplayer1Item()
            item["cardname"] = title.xpath(".//li[@class='cardName']/a/text()").extract()[0]

            vendor = title.xpath(".//tr[@class='vendor ']")
            item["price"] = vendor.xpath("normalize-space(.//td[@class='price']/text())").extract()
            item["quantity"] = vendor.xpath("normalize-space(.//td[@class='quantity']/text())").extract()
            yield item
代码存在多个问题:

from scrapy.spider import BaseSpider
from scrapy.selector import Selector
from tcgplayer1.items import Tcgplayer1Item


class MySpider(BaseSpider):
    name = "tcg"
    allowed_domains = ["http://www.tcgplayer.com/"]
    start_urls = ["http://store.tcgplayer.com/magic/journey-into-nyx?PageNumber=1"]

    def parse(self, response):
        hxs = Selector(response)
        titles = hxs.xpath("//div[@class='magicCard']")
        for title in titles:
            item = Tcgplayer1Item()
            item["cardname"] = title.xpath(".//li[@class='cardName']/a/text()").extract()[0]

            vendor = title.xpath(".//tr[@class='vendor ']")
            item["price"] = vendor.xpath("normalize-space(.//td[@class='price']/text())").extract()
            item["quantity"] = vendor.xpath("normalize-space(.//td[@class='quantity']/text())").extract()
            yield item
  • vendor
    类名需要包含一个尾随空格:“vendor”-很难找到
  • 每个项目有多个供应商-您需要在循环中定义
    vendor
  • 您正在重新定义循环中的
    标题
    变量
  • 循环中的xpath表达式应该是相对的
    /
  • 使用
    选择器
    而不是不推荐使用的
    htmlxpath选择器
  • 使用
    xpath()
    而不是不推荐的
    select()
  • 使用
    normalize-space()

这真的很接近。。。一个问题是价格和数量与卡片不匹配。它显示了每张卡的相同价格列表。。。以及数量。不过这更接近了。@user3680812有一个小问题,我已经更新了代码,请重新检查。是“//tr”做的。。。太多了。@user3680812很高兴它起了作用。这是一个有趣的问题。如果你认为答案是值得的,就考虑接受。谢谢。要让这段代码在第1页中运行到有多少页有多难?