Python学習チャンネル by PyQ

Pythonのオンライン学習プラットフォームPyQのオフィシャルブログです

【お悩み解決】Scrapyでの値の取得方法について、[0] とextract_first()、get()の違いについて

f:id:Arty_Mireiyu:20220112153614p:plain

こんにちは、PyQサポートです。 今回は、Scrapyの要素の取得方法について紹介します。

質問: Scrapyでの値の取得方法について質問です

Scrapyでの値の取得方法について質問です。
response.css('div.item-list')[0]
div_item.css('a.item-name::attr(href)').extract_first()において
[0]extract_first()の違いがわかりません。どちらも同じ意味ではないのかなと思ってしまいました。

どちらを使うかの判断軸も含めて教えてください。

また.extract_first().get()は、挙動は同じという認識で問題ないでしょうか。

回答: 今回の例では[0]、.extract_first()、.get()どれを使っても結果は同じです

今回の例では、どちらを使ってもかまいません。 要素が必ずあると分かっている場合、 [0].extract_first().get()どれを使っても結果は同じです。

要素がないかもしれない場合は、IndexError例外が発生したり、Noneが返されたりと値の取得方法によって結果が変わります。
このため、例外処理をしたり、返り値をチェックしたりなど、実装で気をつけるべきことも変わります。

以下 [0].extract_first()の違いについてもう少し詳しく説明します。

[0] について

response.css('div.item-list')[0]は最初の要素を取得します。

もし、要素がなければ(リストが空なら)IndexError例外を送出します。

.extract_first() について

div_item.css('a.item-name::text').extract_first()は最初の要素を取得します。

もし、要素がなければ(リストが空なら)デフォルト値を返します。
.extract_first()メソッドのデフォルト値はNoneです。

ドキュメントはこちらにあります: https://docs.scrapy.org/en/latest/topics/selectors.html#scrapy.selector.SelectorList.get
以前は、.extract_first()が使われていましたが、最近は.get()に名前が変わりました。
.extract_first()は今も使用できますが、.get()を使う事が推奨されています。

以下、公式ドキュメントからの引用と和訳となります。

https://docs.scrapy.org/en/latest/topics/selectors.html#extract-and-extract-first

If you’re a long-time Scrapy user, you’re probably familiar with .extract() and .extract_first() selector methods. Many blog posts and tutorials are using them as well. These methods are still supported by Scrapy, there are no plans to deprecate them. However, Scrapy usage docs are now written using .get() and .getall() methods. We feel that these new methods result in a more concise and readable code.

和訳:

Scrapyの長期ユーザーは .extract() や .extract_first() メソッドを使い慣れていると思います。多くのblogやチュートリアルでもこれらのメソッドを使っています。これらのメソッドは今もScrapyでサポートしていますし、削除する予定はありません。 しかしながら、Scrapyの今のドキュメントでは .get() と .getall() メソッドを使うようにしています。こちらのメソッドの方が簡潔で読みやすいコードになると考えているためです。

注)質問時点では、PyQは .extract_first() を使っていましたが、現在は .get() を使っています。

Copyright ©2017- BeProud Inc. All rights reserved.