XPathの:のpython3 Webクローラーの戦闘-28、解析ライブラリを使用します

1で私達は基本的な爬虫類を実装し、私たちは、正規表現のページを抽出するために使用した情報は、我々は正規表現を使用した後、非常に複雑な構造であることがわかり、ケース内の1つの事間違った場所それは試合が失敗する可能性があり、その情報または一部多かれ少なかれ不便を抽出するために、通常のページを使用することができます。

ノードページのために、それはID、クラス、または他の属性だけでなく、ノード間の階層関係を定義することができ、ページは、一つ以上のノードのXPathやCSSセレクタを介して配置することができます。だから、ときにページの解析、我々はノードを抽出するためのXPathやCSSセレクタを使用して、そのテキストの内容や属性を取得するために、適切なメソッドを呼び出して、我々はそれをしたい任意の情報を抽出することはできませんか?

Pythonでは、どのように我々は、この操作にそれを達成していますか?彼らと、私たちはもはや通常のを心配する必要は、より強力なライブラリの一つは、この章ではLXML、BeautifulSoup、PyQueryなどを持って、我々はこれら三つの解析ライブラリの使用を紹介します、これは非常に多くのライブラリを解析してきた、心配しないでくださいそして、分析効率を大幅に、実際には、爬虫類のための不可欠なツールを改善します。

XPathの使用

XPathの、XMLパス言語、つまりXMLパス言語の完全な名前は、それがXMLドキュメントの言語で見つけた情報です。XPathのは、元々XML文書を検索するように設計されたが、それはまた、HTML文書を検索するために適用されました。

そう爬虫類を行うことで、私たちは、このセクションでは、我々は、XPathの基本的な使い方を紹介し、適切な情報の抽出を行うために、XPathを使用することができます。

1. XPathの概要

XPathの選択はまた、ほぼ等ノードの処理シーケンスを一致文字列、数値、及び時間100以上の組み込み関数を提供し、それは非常に簡潔な表現の経路選択を提供し、非常に強力です私たちは、選択するために、XPathを使用することができ、すべてのノードをターゲットにしたいです。

1999年11月16日のXPathはW3C標準になった、それはXSLT、XPointerのと他のXML解析ソフトウェアで使用するために設計され、より多くのドキュメントは、彼らの公式ウェブサイトを訪問することができます:https://www.w3.org/TR/xpath/

2. XPathの共通のルール

私たちは今、表には、いくつかの一般的なルールを示しますを見てみましょう。

表現 説明
ノード名 このノードのすべての子ノードを選択します
/ 現在のノードから選択された直接の子ノード
// 選択したノードから現在のノードの子孫
現在のノードを選択します
。.. 現在のノードの親を選択します
@ [プロパティ]を選択します

ここで、現在のノードを選択するのすべての子孫ノードを表す、現在のノード..属性@代表的な選択された親ノードが追加される//選択を表す例えば/担当者が直接の子ノードを選択し、一般のXPathマッチングルールのリスト、属性に一致する特定のノードを選択し、定義します。

例えば:

//title[@lang=’eng’]
Python资源分享qun 784758214 ,内有安装包,PDF,学习视频,这里是Python学习者的聚集地,零基础,进阶,都欢迎

これは、値ENG langはノード属性ながら、それは、タイトルのために選択されたすべての名前を表し、XPathのルールです。

その後、我々は詳細にLXMLライブラリのPythonによるXPathの、XPathを使用してHTMLの解析の使用を説明します。

3.準備

私たちの最初の前に、このようなインストール手順は、第一章であるノーインストールとLXMLライブラリを、インストールされていることを確認してください。

導入の4例

次のように私たちは今、プロセスのページを解析するために使用するXPathを感じるために例を使用します。

from lxml import etree
text = '''
<div>
    <ul>
         <li class="item-0"><a href="link1.html">first item</a></li>
         <li class="item-1"><a href="link2.html">second item</a></li>
         <li class="item-inactive"><a href="link3.html">third item</a></li>
         <li class="item-1"><a href="link4.html">fourth item</a></li>
         <li class="item-0"><a href="link5.html">fifth item</a>
     </ul>
 </div>
'''
html = etree.HTML(text)
result = etree.tostring(html)
print(result.decode('utf-8'))

ここでは、最初のLXMLライブラリetreeモジュールを導入して、HTMLのテキストの一部を宣言し、HTML我々は成功したXPath構文解析オブジェクトを作成するように、クラスが初期化される呼び出しは、ここで最後のノードのli HTMLテキストがないことに注意しました閉じられたが、それは自動的にHTMLテキストのetreeモジュールを修正することができます。

ここでは、HTMLのコードであってもよい出力補正方法の後にtoString()を呼び出し、その結果は、ここで、バイトのタイプである私たちは、デコード()メソッドのstrは以下の結果を型に変換使用します。

<html><body><div>
    <ul>
         <li class="item-0"><a href="link1.html">first item</a></li>
         <li class="item-1"><a href="link2.html">second item</a></li>
         <li class="item-inactive"><a href="link3.html">third item</a></li>
         <li class="item-1"><a href="link4.html">fourth item</a></li>
         <li class="item-0"><a href="link5.html">fifth item</a>
     </li></ul>
 </div>
</body></html>

我々は、治療のliノードラベルの後に完了していることがわかり、また自動的体、HTMLノードを追加することができます。

また、我々はまた、直接例えば、解析されたテキストファイルを読むことができます:

from lxml import etree

html = etree.parse('./test.html', etree.HTMLParser())
result = etree.tostring(html)
print(result.decode('utf-8'))

次のように前記test.htmlという内容は上記の例のHTMLコードは、次のとおりです。

<div>
    <ul>
         <li class="item-0"><a href="link1.html">first item</a></li>
         <li class="item-1"><a href="link2.html">second item</a></li>
         <li class="item-inactive"><a href="link3.html">third item</a></li>
         <li class="item-1"><a href="link4.html">fourth item</a></li>
         <li class="item-0"><a href="link5.html">fifth item</a>
     </ul>
 </div>
Python资源分享qun 784758214 ,内有安装包,PDF,学习视频,这里是Python学习者的聚集地,零基础,进阶,都欢迎

これは、DOCTYPE宣言よりもわずかに異なる出力、ですが、次のとおりであり、分析結果には影響しません。

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><body><div>
    <ul>
         <li class="item-0"><a href="link1.html">first item</a></li>
         <li class="item-1"><a href="link2.html">second item</a></li>
         <li class="item-inactive"><a href="link3.html">third item</a></li>
         <li class="item-1"><a href="link4.html">fourth item</a></li>
         <li class="item-0"><a href="link5.html">fifth item</a>
     </li></ul>
 </div></body></html>

5.すべてのノード

私たちは、通常、上記のテキストHTMLテキストの要件を満たすために、すべてのノードを選択するには、ルールの先頭に// XPathの使用我々は、すべてのノードを選択したい場合は、例えば、達成することができます。

from lxml import etree
html = etree.parse('./test.html', etree.HTMLParser())
result = html.xpath('//*')
print(result)

結果:

[<Element html at 0x10510d9c8>, <Element body at 0x10510da08>, <Element div at 0x10510da48>, <Element ul at 0x10510da88>, <Element li at 0x10510dac8>, <Element a at 0x10510db48>, <Element li at 0x10510db88>, <Element a at 0x10510dbc8>, <Element li at 0x10510dc08>, <Element a at 0x10510db08>, <Element li at 0x10510dc48>, <Element a at 0x10510dc88>, <Element li at 0x10510dcc8>, <Element a at 0x10510dd08>]

私たちはあなたのリストの形でリターンを見ることができ、すべてのノードが全体のHTMLテキストがキャプチャされることになる、つまり、一致するすべてのノードのために、ここで*は、各要素は、HTML、体としてノードの名前が続く要素型は、あります、DIV、UL、李、など、すべてのノードがリストに含まれています。

もちろん、あなたはまた、我々は、たとえば、すべてのliノードを取得したい場合は、ノード名と一致し、ここで指定することができます。

from lxml import etree
html = etree.parse('./test.html', etree.HTMLParser())
result = html.xpath('//li')
print(result)
print(result[0])

ここでは、すべての李//ノードを使用することができ、その後、直接呼び出すのxpath()メソッドを抽出することができたときに、直接呼び出すことができるノードの名前を追加]を選択します。

結果:

[<Element li at 0x105849208>, <Element li at 0x105849248>, <Element li at 0x105849288>, <Element li at 0x1058492c8>, <Element li at 0x105849308>]
<Element li at 0x105849208>

ここでは、目的の一つは、[0]のように、撮影した直接括弧で索引付けすることができる取り出すべき場合、Elementオブジェクトの要素であり、その各々は、抽出結果がリスト形式であることがわかります。

6.子ノード

私たちは、今、私たちはノードのすべての直接の子ノード李を選択したい、あなたは、追加することにより、/または//子ノードまたは子孫ノード要素を見つけるために実装することができます。

from lxml import etree

html = etree.parse('./test.html', etree.HTMLParser())
result = html.xpath('//li/a')
print(result)

ここでLiは// Liなどのすべてのノードをチェックされ、すべてのリーのすべてのノードに/ A、すなわち選択された直接の子ノードを追加することで、/ aは李にノードのすべての直接の子ノードを選択し、組み合わせ、すなわち2我々すべての直接のliノードのすべての子ノードを取得します。

結果:

[<Element a at 0x106ee8688>, <Element a at 0x106ee86c8>, <Element a at 0x106ee8708>, <Element a at 0x106ee8748>, <Element a at 0x106ee8788>]

ここでは/直接の子ノードを選択されている。しかし、我々は//の使用に関連したノードのすべての子孫を取得したい場合、例えば、我々はノードUL内のノードのすべての子孫を取得したい、これを達成することができます。

from lxml import etree

html = etree.parse('./test.html', etree.HTMLParser())
result = html.xpath('//ul//a')
print(result)

営業結果は同じです。

しかし、我々は/直接ではなくノードUL内の子ノード、李ノード間のみ、直接の子ノードであるので、私はすべての一致を得ることができないので、次のように、コードは、// UL /任意の結果でここに来ることができない場合:

from lxml import etree

html = etree.parse('./test.html', etree.HTMLParser())
result = html.xpath('//ul/a')
print(result)

結果:

[]

そこでここでは、注意してください/と//相違しなければならない、/ノード//は子供や孫を取得することで、直接の子ノードです。

7.親

私たちは、あなたが私たちが見つける方法を知っていれば、子は親がないノードという、ノードまたは連続/または//の子孫によって子ノードを見つけることができることを知っていますか?ここでは、親ノードを取得するために...使用することができます。

たとえば、私たちは今、ノードの最初の選択のhref link4.html、その親ノードの取得され、その後、そのクラスのプロパティを取得し、次のように、コードは次のとおりです。

from lxml import etree

html = etree.parse('./test.html', etree.HTMLParser())
result = html.xpath('//a[@href="link4.html"]/../@class')
print(result)

結果:

['item-1']

結果を確認し、それが成功した親ノードを取得するには、我々が得る李クラスのターゲット・ノードです。

また、親ノードの親を取得することができます::、次のようにコードは次のとおりです。

from lxml import etree

html = etree.parse('./test.html', etree.HTMLParser())
result = html.xpath('//a[@href="link4.html"]/parent::*/@class')
print(result)

8.属性マッチング

我々はまた、我々はLiがアイテム-1、実現することができるのノードクラスがどこにあるかを選択したい場合は、例えば、選択されたとき、@プロパティを使用してフィルタリングすることができます。

from lxml import etree
html = etree.parse('./test.html', etree.HTMLParser())
result = html.xpath('//li[@class="item-0"]')
print(result)
Python资源分享qun 784758214 ,内有安装包,PDF,学习视频,这里是Python学习者的聚集地,零基础,进阶,都欢迎

ここでは、追加して、[クラスは、=「アイテム-0は」@]ノードは項目0であるクラス属性を制限し、資格のあるノードが2つのli HTMLテキストを持っているので、結果が一致した2のリターンに返されるべきです次のように一般的に、結果は以下のとおりです。

[<Element li at 0x10a399288>, <Element li at 0x10a3992c8>]

目に見える結果は2という正しくないとして、我々は後で確認し、正確に2一致します。

9.テキスト取得

我々は()メソッドは、テキストでXPathを持つテキストノードを取得し、我々は次のように、それは、Liノードテキストの上、コードが取得しようとしています。

from lxml import etree

html = etree.parse('./test.html', etree.HTMLParser())
result = html.xpath('//li[@class="item-0"]/text()')
print(result)

結果は以下の通りであります:

['\n ']

我々が理由であるが、唯一の改行を取得するには、任意のテキストに取得していないという不思議なのですか?XPathのテキストは()であるので、フロント/、これ/直接の子ノードの意味を選択するが、ここでは、テキストが内部ノードであり、直接の子ノードがノードLiがあることは明らかであるので、ここに一致その結果、内部ノードのLi改行が旅行のためのLiノード自動補正の終了タグので、補正することです。

ていることを確認し、これら二つのノードということです。

<li class="item-0"><a href="link1.html">first item</a></li>
<li class="item-0"><a href="link5.html">fifth item</a>
</li>

前記テール・ノードのラベルLiが旅行のために追加したときに、抽出ラインが最終結果との間で分割し、ので、自動的に正しいノードがテキストノードのラベルおよびテール・ノードを取得した独自のラベル李です。

我々は2つの方法があります李ノード内のテキストを取得したいのであれば、一つには、ノードを選択し、テキストを取得することであり、もう一つは、我々ははいを見て二つの違いは何//使用することです。

まず、我々はノード再取得にテキストを選択し、以下のように、コードは次のとおりです。

from lxml import etree

html = etree.parse('./test.html', etree.HTMLParser())
result = html.xpath('//li[@class="item-0"]/a/text()')
print(result)

結果:

['first item', 'fifth item']

ここでは、戻り値は2で見ることができ、コンテンツはテキストのli属性ノード項目-0、また、我々はマッチングが正しい属性上記の結果を確認しています。

ここでは、層ごとに選択され、最初のliノードを選択し、使用/その直接の子ノードaを選択するようにして、テキストを選択し、その結果はまさに我々が期待される二つの結果と一致しています。

次のように私たちは、結果が//選択された別の方法を見てみましょう:

from lxml import etree

html = etree.parse('./test.html', etree.HTMLParser())
result = html.xpath('//li[@class="item-0"]//text()')
print(result)

結果:

['first item', 'fifth item', '\n ']

予想されるように、結果はここで3であるテキストは、すべての子孫ノードを選択することである場合、最初の二つのサブLiはノードのテキストノードであり、他の一つはノード中のLi最後のテキストであり、想像することができ、その行が壊れます。

私たちは、ノードの子孫内のすべてのテキストを取得したいのであれば、あなたが最も包括的なテキストメッセージを取得するために確保することができますが、いくつかの改行や他の特殊文字と混合することができるので、テキスト()の方法を追加します。//直接アクセスを使用することができます。我々は、特定の子孫ノード内のすべてのテキストを取得したい場合は、特定のノードの子孫を選択することができ、その内部テキストを取得するには、テキスト()メソッドを呼び出して、あなたは得られた結果がきちんとしていることを確認することができます。

10.プロパティを取得します。

私たちは、テキストノードの中に入ることができ、ノードはそれを取得する方法という属性)(テキストと知っていますか?実際には、あなたはまだ、たとえば、我々は次のように、李すべてのノード内のすべてのノードのhref属性を取得したい、@記号を使用することができます。

from lxml import etree

html = etree.parse('./test.html', etree.HTMLParser())
result = html.xpath('//li/a/@href')
print(result)

ここでは、@href href属性を介して別のノードを取得することができ、及び属性がマッチング法に留意、マッチング属性は、[HREF =「link1.html」@]などの属性名と属性の値定義ブラケットを、添加しますここで@hrefは、プロパティノードの取得を指しながら、双方を区別する必要があります。

結果:

['link1.html', 'link2.html', 'link3.html', 'link4.html', 'link5.html']

あなたは、リストを返し、我々は成功し、すべてのノード李にhref属性ノードを取得していることがわかります。

11.複数値属性の一致

時々属性のノードの一部は、次の例のように、複数の値を有していてもよいです。

from lxml import etree
text = '''
<li class="li li-first"><a href="link.html">first item</a></li>
'''
html = etree.HTML(text)
result = html.xpath('//li[@class="li"]/a/text()')
print(result)

ここではHTMLテキストノード中のLiクラス属性は、2つの値李およびLi-最初のがありますが、私たちは財産に合わせた取得したい場合は、この時間の前にコードに結果が一致しない場合があります。

[]

ある場合、属性を複数使用する必要がある値()関数が含まれている次のように、コードを書き換えることができます。

from lxml import etree
text = '''
<li class="li li-first"><a href="link.html">first item</a></li>
'''
html = etree.HTML(text)
result = html.xpath('//li[contains(@class, "li")]/a/text()')
print(result)

したがって、我々は()メソッド、最初の引数の属性名が含まれているので、長い間、この属性が一致を完了するために、渡された属性値が含まれているとして、渡された二番目のパラメータの値を属性。

結果:

['first item']

ノードの属性は、ノードのクラス属性として、複数の値、通常以上を有する場合、このような選択方法がしばしば用いられます。

12.マルチ属性マッチング

加えて、我々はまた、状況が発生する可能性があり、我々は属性に応じて複数のノードを決定する必要がある場合があり、それは複数の属性と一致する必要があり、その後、例えば、本明細書中にオペレータと接続を使用することができます。

from lxml import etree
text = '''
<li class="li li-first" name="item"><a href="link.html">first item</a></li>
'''
html = etree.HTML(text)
result = html.xpath('//li[contains(@class, "li") and @name="item"]/a/text()')
print(result)

次のようにここでのli HTMLのテキストノードは、属性名、私たちはクラス名とプロパティに応じて選択する必要があり、この時間を追加し、演算子は二つの条件に接続することができ、両方の条件が括弧で囲まれて、結果は以下のとおりです。

['first item']

ここでは、実際にXPath演算子内、および多くのオペレータ、などや、MODなどがあり、次のようにここに要約:

演算子 説明 返却値
若しくは 若しくは 価格= 9.80や価格= 9.70 価格は9.80である場合、それはtrueを返します。価格は9.50である場合は、falseが返されます。
そして 価格> 9.00と価格<9.90 価格は9.80である場合、それはtrueを返します。価格は8.50である場合は、falseが返されます。
モッズ 除算の剰余計算 5 MOD 2 1
\ 二組のノードの計算 // //ブックCD 設定されたノードは、書籍やCDのすべての要素を持って返します
+ 追加 6 + 4 10
- 引き算 6から4 2
* 乗算 6 * 4 24
DIV 除算 8 DIV 4 2
= 等しいです 価格= 9.80 価格は9.80である場合、それはtrueを返します。価格は9.90である場合は、falseが返されます。
!= 等しくありません 価格!= 9.80 価格は9.90である場合、それはtrueを返します。価格は9.80である場合は、falseが返されます。
< 以下 価格<9.80 価格は9.00である場合、それはtrueを返します。価格は9.90である場合は、falseが返されます。
<= より小さいか等しいです 価格<= 9.80 価格は9.00である場合、それはtrueを返します。価格は9.90である場合は、falseが返されます。
> より大きい 価格> 9.80 価格は9.90である場合、それはtrueを返します。価格は9.80である場合は、falseが返されます。
> = 以上 価格> = 9.80 価格は9.90である場合、それはtrueを返します。価格は9.70である場合は、falseが返されます。

このテーブル参照元:http://www.w3school.com.cn/xp ....

13.順次選択

これを行うにはどのようにして、我々は特定の属性を選択すると、時々、同時に複数のノードに一致するかもしれないが、我々はこのような第二のノードとしてこれらのノードの1、または最後のノードをしたいですか?

この場合、ブラケットは、例えば、ノード固有の順序の指標を得る方法で渡すことができます。

from lxml import etree

text = '''
<div>
    <ul>
         <li class="item-0"><a href="link1.html">first item</a></li>
         <li class="item-1"><a href="link2.html">second item</a></li>
         <li class="item-inactive"><a href="link3.html">third item</a></li>
         <li class="item-1"><a href="link4.html">fourth item</a></li>
         <li class="item-0"><a href="link5.html">fifth item</a>
     </ul>
 </div>
'''
html = etree.HTML(text)
result = html.xpath('//li[1]/a/text()')
print(result)
result = html.xpath('//li[last()]/a/text()')
print(result)
result = html.xpath('//li[position()<3]/a/text()')
print(result)
result = html.xpath('//li[last()-2]/a/text()')
print(result)

我々は最初のliノードを選択する最初の選択肢は、括弧1で、着信番号があること、およびコードが異なる場合に注意を払うことができ、第1号は当初、ないゼロの始まりです。

我々はノードに戻ります)(前回渡さ括弧内に、最後のliノードを選択する2番目の選択肢は、最後の李です。

我々はそれが、位置番号1とノード2の結果であり、第3ノードのLi選択された位置が3未満である選択された、2つのノードのLiの前に得られます。

第四の選択肢は、我々が通過括弧内に第三の最後のLiノードを選択し、最後の() - )(最後の最後のものであるので、図2に示すように、最後の()とすることができる - 図2は、最後の3です。

結果は以下の通りであります:

['first item']
['fifth item']
['first item', 'second item']
['third item']

ここでは、最後の()、位置()関数等を使用するXPath 100は、アクセス処理機能、数値、文字列、論理ノード、及び配列特異的参照を含む複数の機能は、全ての機能を行うことができるが設けられています。http://www.w3school.com.cn/xp ....

13.ノード選択軸

XPathはノード軸選択方法の数を提供し、英語は、ノードの選択を完了するのに便利である特定の状況で使用される、等のサブ要素へのアクセス、兄弟、親要素、祖先要素、を含む、XPathの軸と呼ばれ、我々が感じるように例を使用します:

from lxml import etree

text = '''
<div>
    <ul>
         <li class="item-0"><a href="link1.html"><span>first item</span></a></li>
         <li class="item-1"><a href="link2.html">second item</a></li>
         <li class="item-inactive"><a href="link3.html">third item</a></li>
         <li class="item-1"><a href="link4.html">fourth item</a></li>
         <li class="item-0"><a href="link5.html">fifth item</a>
     </ul>
 </div>
'''
html = etree.HTML(text)
result = html.xpath('//li[1]/ancestor::*')
print(result)
result = html.xpath('//li[1]/ancestor::div')
print(result)
result = html.xpath('//li[1]/attribute::*')
print(result)
result = html.xpath('//li[1]/child::a[@href="link1.html"]')
print(result)
result = html.xpath('//li[1]/descendant::span')
print(result)
result = html.xpath('//li[1]/following::*[2]')
print(result)
result = html.xpath('//li[1]/following-sibling::*')
print(result)

結果:

[<Element html at 0x107941808>, <Element body at 0x1079418c8>, <Element div at 0x107941908>, <Element ul at 0x107941948>]
[<Element div at 0x107941908>]
['item-0']
[<Element a at 0x1079418c8>]
[<Element span at 0x107941948>]
[<Element a at 0x1079418c8>]
[<Element li at 0x107941948>, <Element li at 0x107941988>, <Element li at 0x1079419c8>, <Element li at 0x107941a08>]
Python资源分享qun 784758214 ,内有安装包,PDF,学习视频,这里是Python学习者的聚集地,零基础,进阶,都欢迎

私たちは、祖先の軸を呼び出す最初の選択肢、あなたが得ることができる2つのコロンに続くすべての祖先ノードは、すべてのノードに一致している、話をして、私たちが直接*使用したノードを、選択する必要があり、その結果が第1でありますHTML、ボディ、DIV、ULを含むすべての祖先ノードのliノード。

2番目の選択肢は、我々は資格、コロンとDIV、このようにして得られた結果のdivの唯一の祖先ノードの背後に、この時間を追加しました。

私たちは、属性軸呼んで三時間を選択し、あなたはすべての属性ノードを取得表しセレクタまたは*に続くすべてのプロパティ値を、取得することができ、戻り値は、すべてのプロパティ李ノードの値です。

我々はノードlink1.htmlのhref属性を選択した資格を追加したすべての直接の子ノードへのアクセスを持っている、選択された4番目の子の軸を呼び出します。

我々はdescendant軸を呼んで5回目を選択して、あなたは私たちがスパンノードを取得するために資格を追加したすべての子孫ノードを、得ることができるため、戻りはスパンノードのノードが含まれていないだけ。

我々は、次の軸呼ん第六の選択は、私たちが使用していますが、あなたは現在のノードの後に​​すべてのノードを取得することができ、ここでの試合は*ですが、これだけ二次のノードを取得し、選択インデックスを追加しました。

私たちは、次の-sibling軸を呼び出すために選択した第七、あなたは*すべての兄弟は、現在のノードの後に​​、私たちがここで使用される試合を取得するので、それに続く兄弟ノードの全てを取得することができます。

これらは、XPathの軸の簡単な使用しています

14.おわりに

今まで私たちは基本的にXPathのセレクタ導入の可能な使用が終わっている、組み込み関数非常に多く、巧みに使用した後のXPathは非常に強力で、非常にHTML情報の抽出効率を高めることができます。

おすすめ

転載: blog.51cto.com/14445003/2426467