2013-09-25 1 views
1

Что такое лучший безопасный способ извлечения информации о деталях со страниц? Я имею в виду, иногда на странице может отсутствовать элемент, и вы закончите разбивку искателя.Scrapy безопасный способ извлечения предметов

Посмотрите этот пример:

for cotacao in tabela_cotacoes: 
     citem = CotacaoItem() 
     citem['name'] = cotacao.select("td[4]/text()").extract()[0] 
     citem['symbol'] = cotacao.select("td/a/b/text()").extract()[0] 
     citem['current'] = cotacao.select("td[6]/text()").extract()[0] 
     citem['last_neg'] = cotacao.select("td[7]/text()").extract()[0] 
     citem['oscillation'] = cotacao.select("td[8]/text()").extract()[0] 
     citem['openning'] = cotacao.select("td[9]/text()").extract()[0] 
     citem['close'] = cotacao.select("td[10]/text()").extract()[0] 
     citem['maximum'] = cotacao.select("td[11]/text()").extract()[0] 
     citem['minimun'] = cotacao.select("td[12]/text()").extract()[0] 
     citem['volume'] = cotacao.select("td[13]/text()").extract()[0] 

Если какой-либо элемент отсутствует на странице, .extract() возвращает [] и вызов [0] на них сгенерирует исключение (из диапазона).

Итак, вопрос в том, что это лучший способ/подход, чтобы справиться с этим.

+0

Отдельная проблема, но я бы сделал параллельный список вместо того, чтобы печатать (или копировать) все функции из 10 раз. 'Поля = ['name', 'current', 'last_neg' ...]; Nums = [4,6,7 ...] 'them loop through 'для MyField, MyNum в zip (Поля, Числа): citem [MyField] = cotacao ... [MyNum] ...' Тогда вы можете это сделать просто с одним циклом ... – beroe

ответ

2

Написать немного вспомогательную функцию:

def extractor(xpathselector, selector): 
    """ 
    Helper function that extract info from xpathselector object 
    using the selector constrains. 
    """ 
    val = xpathselector.select(selector).extract() 
    return val[0] if val else None 

И использовать его как это:

citem['name'] = extractor(cotacao, "td[4]/text()") 

возвращают соответствующее значение, чтобы указать, что citem не был найден. В моем коде я вернул None, при необходимости измените его (например, верните '', если это имеет смысл).

+0

Я боялся, что мне придется делать проверку на каждой строке и быть слишком подробным. Используя вспомогательную функцию, держите ее в чистоте, это приятно. Это решение, которое вы используете в своих проектах? Спасибо за ответ. – Medeiros

+0

@Medeiros да, это так. Я всегда использую много небольших вспомогательных процедур для проверки и т. Д. Мне не нравится держать вещи слишком подробными :) –

+0

Конечно, я всегда немного до принятия, потому что обсуждение может расти и нужно адаптировать вопрос и/или ответить. Все побеждают. :) – Medeiros