所以我的scrapy工作非常好。它从页面中抓取数据,但我遇到的问题是有时页面的表顺序不同。例如,它到达的第一页:
Row name Data
Name 1 data 1
Name 2 data 2
它抓取的下一页可能会使订单完全不同。其中Name 1
是第一行,任何其他页面可能是第3行,第4行等。行名称始终相同。我想这可能是两种不同的方式中的一种,我不确定哪种方法可行或哪种更好。
第一个选项,使用一些if
语句来查找我需要的行,然后获取以下列。这似乎有点乱,但可以奏效。
第二个选项,无论顺序如何,都抓住表中的所有数据并将其放在dict
中。这样,我可以根据行名称获取所需的数据。这似乎是最干净的方法。
是否有第三种选择或更好的方法?
这是我的代码,以防它有用。
class pageSpider(Spider):
name = "pageSpider"
allowed_domains = ["domain.com"]
start_urls = [
"http://domain.com/stuffs/results",
]
visitedURLs = Set()
def parse(self, response):
products = Selector(response).xpath('//*[@class="itemCell"]')
for product in products:
item = PageScraper()
item['url'] = product.xpath('div[2]/div/a/@href').extract()[0]
urls = Set([product.xpath('div[2]/div/a/@href').extract()[0]])
print urls
for url in urls:
if url not in self.visitedURLs:
request = Request(url, callback=self.productpage)
request.meta['item'] = item
yield request
def productpage(self, response):
specs = Selector(response).xpath('//*[@id="Specs"]')
item = response.meta['item']
for spec in specs:
item['make'] = spec.xpath('fieldset[1]/dl[1]/dd/text()').extract()[0].encode('utf-8', 'ignore')
item['model'] = spec.xpath('fieldset[1]/dl[4]/dd/text()').extract()[0].encode('utf-8', 'ignore')
item['price'] = spec.xpath('fieldset[2]/dl/dd/text()').extract()[0].encode('utf-8', 'ignore')
yield item
productpage
中的xpath可以包含与我需要的数据不对应的数据,因为订单已更改。
编辑:
我正在尝试dict
方法,我认为这是最佳选择。
def productpage(self, response):
specs = Selector(response).xpath('//*[@id="Specs"]/fieldset')
itemdict = {}
for i in specs:
test = i.xpath('dl')
for t in test:
itemdict[t.xpath('dt/text()').extract()[0]] = t.xpath('dd/text()').extract()[0]
item = response.meta['item']
item['make'] = itemdict['Brand']
yield item
答案 0 :(得分:0)
This seems like the best and cleanest approach (using dict
)
def productpage(self, response):
specs = Selector(response).xpath('//*[@id="Specs"]/fieldset')
itemdict = {}
for i in specs:
test = i.xpath('dl')
for t in test:
itemdict[t.xpath('dt/text()').extract()[0]] = t.xpath('dd/text()').extract()[0]
item = response.meta['item']
item['make'] = itemdict['Brand']
yield item