Python Scrapy для захвата столбцов и строк таблицы

Я относительно noob на python, и это мой первый тренинг. Я уже давно делал интеллектуальный анализ данных с perl, но это совершенно другой мяч!

Я пытаюсь очистить стол, захватить столбцы каждой строки. Мой код ниже.

items.py

from scrapy.item import Item, Field class Cio100Item(Item): company = Field() person = Field() industry = Field() url = Field() 

scrape.py (паук)

 from scrapy.spider import BaseSpider from scrapy.selector import Selector from cio100.items import Cio100Item items = [] class MySpider(BaseSpider): name = "scrape" allowed_domains = ["cio.co.uk"] start_urls = ["http://www.cio.co.uk/cio100/2013/cio/"] def parse(self, response): sel = Selector(response) tables = sel.xpath('//table[@class="bgWhite listTable"]//h2') for table in tables: # print table item = Cio100Item() item['company'] = table.xpath('a/text()').extract() item['person'] = table.xpath('a/text()').extract() item['industry'] = table.xpath('a/text()').extract() item['url'] = table.xpath('a/@href').extract() items.append(item) return items 

У меня есть некоторые проблемы с пониманием того, как правильно формулировать выбор xpath.

Я думаю, что эта линия является проблемой:

  tables = sel.xpath('//table[@class="bgWhite listTable"]//h2') 

Когда я запускаю скребок, как выше результата, я получаю такие вещи в терминале:

 2014-01-13 22:13:29-0500 [scrape] DEBUG: Scraped from <200 http://www.cio.co.uk/cio100/2013/cio/> {'company': [u"\nDomino's Pizza\n"], 'industry': [u"\nDomino's Pizza\n"], 'person': [u"\nDomino's Pizza\n"], 'url': [u'/cio100/2013/dominos-pizza/']} 2014-01-13 22:13:29-0500 [scrape] DEBUG: Scraped from <200 http://www.cio.co.uk/cio100/2013/cio/> {'company': [u'\nColin Rees\n'], 'industry': [u'\nColin Rees\n'], 'person': [u'\nColin Rees\n'], 'url': [u'/cio100/2013/dominos-pizza/']} 

В идеале я хочу только один блок, а не два, с Domino's в слоте компании, Colin в личном слоте, и индустрия захватила, чего это не делает.

Когда я использую firebug для проверки таблицы, я вижу h2 для столбцов 1 и 2 (компания и человек), но столбец 3 – h3?

Когда я изменяю строку таблиц на h3 в конце, следующим образом

  tables = sel.xpath('//table[@class="bgWhite listTable"]//h3') 

Я получаю это

 2014-01-13 22:16:46-0500 [scrape] DEBUG: Scraped from <200 http://www.cio.co.uk/cio100/2013/cio/> {'company': [u'\nRetail\n'], 'industry': [u'\nRetail\n'], 'person': [u'\nRetail\n'], 'url': [u'/cio100/2013/dominos-pizza/']} 

Здесь он производит только 1 блок, и он правильно обрабатывает Индустрию и URL. Но он не получает название компании или человека.

Любая помощь будет оценена!

Благодаря!

One Solution collect form web for “Python Scrapy для захвата столбцов и строк таблицы”

насколько xpath идет, подумайте о том, чтобы сделать что-то вроде:

 $ scrapy shell http://www.cio.co.uk/cio100/2013/cio/ ... >>> for tr in sel.xpath('//table[@class="bgWhite listTable"]/tr'): ... item = Cio100Item() ... item['company'] = tr.xpath('td[2]//a/text()').extract()[0].strip() ... item['person'] = tr.xpath('td[3]//a/text()').extract()[0].strip() ... item['industry'] = tr.xpath('td[4]//a/text()').extract()[0].strip() ... item['url'] = tr.xpath('td[4]//a/@href').extract()[0].strip() ... print item ... {'company': u'LOCOG', 'industry': u'Leisure and entertainment', 'person': u'Gerry Pennell', 'url': u'/cio100/2013/locog/'} {'company': u'Laterooms.com', 'industry': u'Leisure and entertainment', 'person': u'Adam Gerrard', 'url': u'/cio100/2013/lateroomscom/'} {'company': u'Vodafone', 'industry': u'Communications and IT services', 'person': u'Albert Hitchcock', 'url': u'/cio100/2013/vodafone/'} ... 

кроме того, что вам лучше yield предметы один за другим, а не накапливать их в списке

Python - лучший язык программирования в мире.