Scrapy-selectors

提供:Dev Guides
移動先:案内検索

スクレイピー-セレクター

説明

Webページをスクレイピングするときは、XPath式またはCSS式を使用して実現される selectors と呼ばれるメカニズムを使用して、HTMLソースの特定の部分を抽出する必要があります。 セレクタは、Python言語でXMLとHTMLを処理する lxml ライブラリに基づいています。

次のコードスニペットを使用して、セレクタのさまざまな概念を定義します-

<html>
   <head>
      <title>My Website</title>
   </head>

   <body>
      <span>Hello world!!!</span>
      <div class = 'links'>
         <a href = 'onel'>Link 1<img src = 'image1.jpg'/></a>
         <a href = 'twol'>Link 2<img src = 'image2.jpg'/></a>
         <a href = 'threel'>Link 3<img src = 'image3.jpg'/></a>
      </div>
   </body>
</html>

セレクターの構築

*text* または *TextResponse* オブジェクトを渡すことで、セレクタークラスインスタンスを構築できます。 提供された入力タイプに基づいて、セレクタは次のルールを選択します-
from scrapy.selector import Selector
from scrapy.http import HtmlResponse

上記のコードを使用すると、次のようにテキストから構築できます-

Selector(text = body).xpath('//span/text()').extract()

結果は次のように表示されます-

[u'Hello world!!!']

あなたは応答から構築することができます-

response = HtmlResponse(url = 'http://mysite.com', body = body)
Selector(response = response).xpath('//span/text()').extract()

結果は次のように表示されます-

[u'Hello world!!!']

セレクターを使用する

上記の簡単なコードスニペットを使用すると、以下に示すように、タイトルタグで定義されているテキストを選択するためのXPathを構築できます-

>>response.selector.xpath('//title/text()')

今、あなたは次のように示されている* .extract()*メソッドを使用してテキストデータを抽出することができます-

>>response.xpath('//title/text()').extract()

それは次のような結果を生成します-

[u'My Website']

次のように示されているすべての要素の名前を表示することができます-

>>response.xpath('//div[@class = "links"]/a/text()').extract()

次のように要素を表示します-

Link 1
Link 2
Link 3

あなたが最初の要素を抽出したい場合は、次に示すように、メソッド* .extract_first()*を使用します-

>>response.xpath('//div[@class = "links"]/a/text()').extract_first()

次のように要素を表示します-

Link 1

ネストセレクター

上記のコードを使用すると、次のように表示される* .xpath()*メソッドを使用して、ページリンクと画像ソースを表示するセレクターをネストできます-

links = response.xpath('//a[contains(@href, "image")]')

for index, link in enumerate(links):
   args = (index, link.xpath('@href').extract(), link.xpath('img/@src').extract())
   print 'The link %d pointing to url %s and image %s' % args

結果は次のように表示されます-

Link 1 pointing to url [u'onel'] and image [u'image1.jpg']
Link 2 pointing to url [u'twol'] and image [u'image2.jpg']
Link 3 pointing to url [u'threel'] and image [u'image3.jpg']

正規表現を使用したセレクター

Scrapyでは、*。re()*メソッドを使用する正規表現を使用してデータを抽出できます。 上記のHTMLコードから、次のように表示される画像名を抽出します-

>>response.xpath('//a[contains(@href, "image")]/text()').re(r'Name:\s*(.*)')

上記の行には、画像名が表示されます-

[u'Link 1',
u'Link 2',
u'Link 3']

相対XPathを使用する

*/* で始まるXPathを使用している場合、ネストされたセレクターとXPathは、セレクターの相対パスではなく、ドキュメントの絶対パスに関連付けられます。

あなたが <p> 要素を抽出したい場合は、最初にすべてのdiv要素を得ます-

>>mydiv = response.xpath('//div')

次に、以下に示すように*。//p のようにドットをXPathの前に付けることにより、内部のすべての *'p' 要素を抽出できます-

>>for p in mydiv.xpath('.//p').extract()

EXSLT拡張機能の使用

EXSLTは、XMLドキュメントをXHTMLドキュメントに変換するXSLT(Extensible Stylesheet Language Transformations)の拡張機能を発行するコミュニティです。 次の表に示すように、XPath式で登録されたネームスペースでEXSLT拡張機能を使用できます-

Sr.No Prefix & Usage Namespace
1

re

正規表現

http://exslt.org/regexp/indexl
2

set

セット操作

http://exslt.org/set/indexl

前のセクションの正規表現を使用してデータを抽出するための簡単なコード形式を確認できます。

SPathyセレクターでXPathを使用するときに役立つXPathのヒントがいくつかあります。 詳細については、このリンク:/scrapy/xpth_tips [link]をクリックしてください。