[英]Scraping with scrapy
我正在尝试对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
我无法获得价格和数量来显示任何结果。 每张卡都有几个供应商,每个供应商都有自己的价格和数量。 我认为那是我遇到问题的地方。 任何帮助将不胜感激。
首先,这是代码的固定版本:
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
titles
变量 .//
Selector
而不是不HtmlXPathSelector
使用的HtmlXPathSelector
xpath()
代替不推荐使用的select()
normalize-space()
消除price
和quantity
xpath中的换行和多余空间 首先,你可以改变
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()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.