XPathライブラリの使用
5108 ワード
XPathライブラリの使用
XPathは、XMLドキュメントで情報を検索する言語であるx x x MLパス言語です.XMLドキュメントを検索するために最初に使用されましたが、HTMLドキュメントの検索にも適用されます.XPathの選択機能は非常に強力で、非常に簡潔で明瞭なパス選択式を提供します.また、文字列、数値、時間のマッチング、ノード、シーケンスの処理など、00以上の組み込み関数も提供されています.私たちが位置決めしたいノードのほとんどは、XPathで選択できます.例は次のとおりです.
ここではまずlxmlライブラリのetreeモジュールをインポートし、HTMLテキストを宣言し、HTMLクラスを呼び出して初期化し、XPath解析オブジェクトの構築に成功しました.ここで注意したいのは、HTMLテキストは不完全ですが、etreeモジュールはHTMLテキストを自動的に修正することができます.ここではtostring()メソッドを呼び出すと修正したHTMLコードを出力できますが、結果はbytesタイプです.ここではdecode()法を用いてstrタイプに変換する.応答htmlファイルに中国語が存在する場合、上のコードが実行されると文字化けして出力され、解決方法:http://blog.sina.com.cn/s/blog_9e103b930102x1jx.html
ノード選択
Xpath共通規則断面図
もちろんノード名も指定できます
テキストの取得
XPathのtext()メソッドでノードのテキストを取得する
最初に選択したとき、ancestor軸を呼び出し、すべての祖先ノードを取得できます.その後、2つのコロン、それからノードのセレクタが必要です.ここでは*を直接使用して、すべてのノードの2回目の選択に一致することを示します.私たちはまた制限条件を追加しました.今回はコロンの後ろにdivを追加しました.このようにして得られた結果はdivという祖先ノードだけです.3回目の選択でattribute軸を呼び出し、すべてのプロパティ値を取得できます.その後のセレクタは*です.これは、取得ノードのすべてのプロパティを表し、戻り値はliノードのすべてのプロパティ値です.4回目の選択でchid軸を呼び出し,すべての直接サブノードを取得できた.ここではclass属性がtitleのaノードを選択する限定条件を追加した.5回目の選択でdescendant軸を呼び出し、すべての子孫ノードを取得できます.ここでは、spanノードを取得するための限定条件を追加したので、返される結果は、aノードではなくspanノードのみを含む.6回目の選択でfolling軸を呼び出し、現在のノードの後にあるすべてのノードを取得できます.ここでは*マッチングを使用していますが、インデックス選択が追加されているため、2番目の後続ノードのみが取得されます.7回目の選択でfollowing-sibling軸を呼び出し、現在のノードの後にあるすべての兄弟ノードを取得できます.ここでは*マッチングを使用するので、後続のすべての兄弟ノードを取得します.
XPathは、XMLドキュメントで情報を検索する言語であるx x x MLパス言語です.XMLドキュメントを検索するために最初に使用されましたが、HTMLドキュメントの検索にも適用されます.XPathの選択機能は非常に強力で、非常に簡潔で明瞭なパス選択式を提供します.また、文字列、数値、時間のマッチング、ノード、シーケンスの処理など、00以上の組み込み関数も提供されています.私たちが位置決めしたいノードのほとんどは、XPathで選択できます.例は次のとおりです.
from lxml import etree
text = '''
- の に する は のフローチャートを け ります[2017-01-10]
- が を して に してフローチャートを します[2017-01-10]
- アパート の の はフローチャートを り けます[2017-01-10]
- のアパートの の し しの のフローチャート[2017-01-10]
- が を するフローチャート[2017-01-10]
- の フローチャート[2017-01-10]
'''
html = etree.HTML(text)
result = etree.tostring(html,encoding="utf-8",pretty_print=True,method="html")
print(result.decode('utf-8'))
ここではまずlxmlライブラリのetreeモジュールをインポートし、HTMLテキストを宣言し、HTMLクラスを呼び出して初期化し、XPath解析オブジェクトの構築に成功しました.ここで注意したいのは、HTMLテキストは不完全ですが、etreeモジュールはHTMLテキストを自動的に修正することができます.ここではtostring()メソッドを呼び出すと修正したHTMLコードを出力できますが、結果はbytesタイプです.ここではdecode()法を用いてstrタイプに変換する.応答htmlファイルに中国語が存在する場合、上のコードが実行されると文字化けして出力され、解決方法:http://blog.sina.com.cn/s/blog_9e103b930102x1jx.html
ノード選択
Xpath共通規則断面図
もちろんノード名も指定できます
from lxml import etree
html = etree.parse("text.html",parser=etree.HTMLParser(encoding='utf-8'))
ts_result = etree.tostring(html,encoding='utf-8',pretty_print=True,method="html")
all_result = html.xpath('//*') #
li_result = html.xpath('//li') # li
li_a_result = html.xpath('//li/a') # li a
ul_a_result = html.xpath('//ul//a') # a
class_result = html.xpath('//li/../@class') # li class
herf_result = html.xpath('//li/a/@href') # a class
title_result = html.xpath('//a[@class ="title"]') # class title a
print(li_result)
print(li_result[0])
print(li_a_result)
print(ul_a_result)
print(class_result)
print(title_result)
テキストの取得
XPathのtext()メソッドでノードのテキストを取得する
from lxml import etree
html = etree.parse("text.html",parser=etree.HTMLParser(encoding='utf-8'))
li_text = html.xpath('//li/a/text()')
print(li_text)
# contains()
a_text = html.xpath('//a[contains(@class,"test")]/text()')
print(a_text)
# and or
li_text = html.xpath('//li/a[@class = "title" or @calss = "date"]/text()')
print(li_text)
##
result = html.xpath('//li[1]/a/text()') # li
print(result)
result = html.xpath('//li[last()]/a/text()') # li
print(result)
result = html.xpath('//li[position()<3]/a/text()') # 3 li
print(result)
result = html.xpath('//li[last()-2]/a/text()') # li
print(result)
##
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[@class="tittle"]')
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)
最初に選択したとき、ancestor軸を呼び出し、すべての祖先ノードを取得できます.その後、2つのコロン、それからノードのセレクタが必要です.ここでは*を直接使用して、すべてのノードの2回目の選択に一致することを示します.私たちはまた制限条件を追加しました.今回はコロンの後ろにdivを追加しました.このようにして得られた結果はdivという祖先ノードだけです.3回目の選択でattribute軸を呼び出し、すべてのプロパティ値を取得できます.その後のセレクタは*です.これは、取得ノードのすべてのプロパティを表し、戻り値はliノードのすべてのプロパティ値です.4回目の選択でchid軸を呼び出し,すべての直接サブノードを取得できた.ここではclass属性がtitleのaノードを選択する限定条件を追加した.5回目の選択でdescendant軸を呼び出し、すべての子孫ノードを取得できます.ここでは、spanノードを取得するための限定条件を追加したので、返される結果は、aノードではなくspanノードのみを含む.6回目の選択でfolling軸を呼び出し、現在のノードの後にあるすべてのノードを取得できます.ここでは*マッチングを使用していますが、インデックス選択が追加されているため、2番目の後続ノードのみが取得されます.7回目の選択でfollowing-sibling軸を呼び出し、現在のノードの後にあるすべての兄弟ノードを取得できます.ここでは*マッチングを使用するので、後続のすべての兄弟ノードを取得します.