1

ページからアイテム情報を抽出する最も安全な方法は何ですか? つまり、ページでアイテムが欠落している場合があり、クローラーが壊れてしまうことがあります。

この例を見てください:

    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] を呼び出すと例外 (範囲外) が発生します。

問題は、これに対処するための最良の方法/アプローチは何かということです。

4

1 に答える 1

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()")

citemaが見つからなかったことを示す適切な値を返します。私のコード I Nonereturn で、必要に応じて変更します (たとえば、''意味があれば return します)。

于 2013-09-25T15:58:14.753 に答える