Scrapy-セレクター

説明

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

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

<html>
   <head>
      <title>My Website</title>
   </head>
   
   <body>
      <span>Hello world!!!</span>
      <div class = 'links'>
         <a href = 'one.html'>Link 1<img src = 'image1.jpg'/></a>
         <a href = 'two.html'>Link 2<img src = 'image2.jpg'/></a>
         <a href = 'three.html'>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'one.html'] and image [u'image1.jpg']
Link 2 pointing to url [u'two.html'] and image [u'image2.jpg']
Link 3 pointing to url [u'three.html'] 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拡張機能を使用できます。

シニア番号 プレフィックスと使用法 名前空間
1

re

正規表現

http://exslt.org/regexp/index.html

2

set

セット操作

http://exslt.org/set/index.html

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

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