2

我正在尝试用 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

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

4

2 回答 2

2

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

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在循环内定义
  • 您正在titles循环中重新定义变量
  • 循环中的 xpath 表达式应该是相对的.//
  • 使用Selector而不是弃用HtmlXPathSelector
  • 使用xpath()而不是弃用select()
  • 用于normalize-space()消除pricequantityxpaths中的换行符和额外空格
于 2014-05-27T17:56:04.073 回答
1

首先,你可以改变

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

到:

item ["price"] = titles.select("//td[@class='price']/br/text()").extract()
item ["quantity"] = titles.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()
于 2014-05-27T17:52:28.257 回答