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のヒントがいくつかあります。詳細については、このリンクをクリックしてください。