インタープリタパターンを使用して、要素のXPathパスを取得するためのアルゴリズムを実装します。

インタープリタパターンを使用して、要素のXPathパスを取得するためのアルゴリズムを実装します。

[[432233]]

文章

1. 通訳モード

言語に対して、その文法表現(言語のルールを定義するために使用される、言語内の文法記述ツール)を与え、その言語で定義された文を解釈するインタープリタを定義します。

定義は抽象的に聞こえるかもしれません。たとえば、一般的な Web サイトで多言語を実装する場合、まず言語の種類を決定し、さまざまな言語のコーパスを事前に設計する必要があります。次に、構成と統一された変数ルールに基づいて、それらをさまざまな言語にマッピングします。

2. 要素のXpathパス

XPath は、XML ドキュメント内の要素と属性を移動するために使用されます。 XPath は XML ノードの検索に使用されますが、HTML と XML は構造が似ているため、HTML ドキュメント内のノードの検索にも使用できます。ここでは HTML、つまり HTML ページ内で要素が配置されているパスのみを考慮します。

では、要素の Xpath パスを素早く取得するにはどうすればよいでしょうか。実はとても簡単です。Google デバッグ ツールを開いてみましょう。

要素の XPath パスをコピーするには、[XPath のコピー] を選択します。形式は次のようになります。

  1. //*[@id= "juejin" ]/div[2]/main/div/div[1]/article/div[1]

要素の Xpath パスを取得するアプリケーション シナリオは多数あります。たとえば、よく使用する Python クローラーは、クローラー フレームワークを使用して、Xpath パスを介してページ内の dom ノードを簡単に制御し、目的のデータと要素を取得できます。たとえば、要素の Xpath パスをバックエンドに送信すると、バックエンドは特定の機能の使用状況とインタラクション データをカウントできます。たとえば、Web サイトを閲覧しているユーザーの熱分布マップ、パス ポートレートなどを分析できます。

3.jsは要素のXpathパスの取得を実装します

実装する前に、まず Xpath パスの構造を分析してみましょう。たとえば、ページがある場合、要素 span の構造は次のようになります。

  1. <!DOCTYPE html>
  2. <html lang= "ja" >
  3. <ヘッド>
  4. <メタ文字セット= "UTF-8" >
  5. <meta name = "viewport" content = "width=device-width, initial-scale=1.0" >
  6. <meta http-equiv= "X-UA-compatible" content= "ie=edge" >
  7. <title>ドキュメント</title>
  8. </head>
  9. <本文>
  10. <div>
  11. <span>私は徐小曦です</span>
  12. </div>
  13. </本文>
  14. </html>

その場合、Xpath パスは次のようになります。

  1. HTML/BODY|HEAD/DIV/SPAN

上記からわかるように、右端の要素がターゲット要素であり、左端の最初の要素が最も外側のコンテナーです。このプロセスを完了するには、まず、要素の parentNode を介して現在の要素の親要素を取得し、最上位の位置を見つける必要があります。ただし、前のレイヤーを見つけるたびに、その要素の前の兄弟要素もトラバースする必要があることにも注意する必要があります。この兄弟要素の名前がその後ろの要素の名前と同じ場合は、要素名に 1 を追加します。

最初のステップは、同じレベルの兄弟要素を走査するメソッド getSameLevelName を実装することです。

  1. // 兄弟要素の名前を取得する
  2. 関数getSameLevelName(ノード){
  3. // 兄弟要素がある場合
  4. if(node.previousSibling) {
  5. let name = '' , // 返される兄弟要素名の文字列
  6. count = 1, // 隣接する兄弟要素内の同じ名前を持つ要素の数
  7. ノード名 = ノード.ノード名、
  8. 兄弟 = node.previousSibling;
  9. while(兄弟){
  10. if(sibling.nodeType == 1 && sibling.nodeType === node.nodeType && sibling.nodeName){
  11. if(nodeName == 兄弟.nodeName){
  12. 名前+= ++カウント;
  13. }それ以外{
  14. // 同じ隣接ノード名を持つノードの数を再作成します
  15. カウント= 1;
  16. // 新しいノード名を追加
  17. 名前+= '|' + 兄弟ノード名.toUpperCase()
  18. }
  19. }
  20. 兄弟 = 兄弟.前の兄弟;
  21. }
  22. 戻る 名前 
  23. }それ以外{
  24. // 兄弟要素がない場合は''を返します 
  25. 戻る  ''  
  26. }
  27. }

2 番目のステップは、ドキュメント ツリーをトラバースすることです。

  1. // XPathインタープリタ
  2. インタープリタ = (関数() {
  3. 戻る 関数(ノード、ラップ){
  4. // パス配列
  5. パス = [] とします。
  6. // コンテナノードがない場合、デフォルトはドキュメントです
  7. wrap = wrap || ドキュメント;
  8. // 現在のノードがコンテナノードと等しい場合
  9. if(node ​​=== wrap) {
  10. ラップノードタイプ == 1 の場合
  11. パスをプッシュします(wrap.nodeName.toUpperCase())
  12. }
  13. 戻り経路
  14. }
  15. // 現在のノードの親ノードがコンテナノードと等しくない場合
  16. if(node.parentNode !== wrap){
  17. // 現在のノードの親ノードに対してトラバーサル操作を実行します
  18. パス = arguments.callee(node.parentNode, wrap)
  19. }
  20. // 現在のノードの親要素ノードがコンテナノードと同じ場合
  21. それ以外{
  22. wrap.nodeType == 1 && path.push(wrap.nodeName.toUpperCase())
  23. }
  24. // 要素の兄弟要素の名前統計を取得します
  25. 兄弟の名前を getSameLevelName(ノード) にします。
  26. ノードのノードタイプが1の場合
  27. path.push(node.nodeName.toUpperCase() + サブリング名)
  28. }
  29. // 最終的なパス配列の結果を返す
  30. 戻り経路
  31. }
  32. })()

これら 2 つの方法を使用すると、要素の XPath パスを簡単に取得できます。次に例を示します。

  1. path = Interpreter(document.querySelector( 'span' ))とします。
  2. console.log(パス.join ( '/' ))

これは、開始と同じデータ構造を返します。例: HTML/BODY|HEAD/DIV/SPAN

<<:  10の古典的なソートアルゴリズム

>>:  人工知能の時代においても、人間同士の交流は依然として重要である

ブログ    
ブログ    

推薦する

...

GPT-4は私のガールフレンドのアレルゲンを発見しました

「インチキ医者」 GPT-4は再び患者の治療に呼ばれ、若い男のガールフレンドのアレルゲンを見つけるこ...

OpenAIがズームイン!史上最強の「モデルストア」が立ち上げられ、すべてのChatGPTアプリケーションを接続する

OpenAI がまたしてもビッグトリックを公開しました!簡単に言えば、サム・アルトマンは市場にあるす...

人工知能(AI)とスポーツスタジアムの融合

新型コロナウイルスCOVID-19の影響は今も続いており、世界中の多くのスポーツスタジアムが麻痺状態...

膨大な顔情報が収集されている: 315 Galaが顔認識の混乱を暴露

3月15日、毎年恒例のCCTV Finance 3.15 Galaが開催されています。序文から判断す...

ガートナー: 高等教育における人工知能

人工知能 (AI) は高等教育に大きな進歩を遂げており、何らかの形で AI を導入した教育機関は、学...

...

...

個人情報保護を強力に強化

動物園に行くときは指紋で「チェックイン」する必要があり、家に帰ってコミュニティに入るときも顔をスキャ...

...

2021 年の人工知能の最新動向を示す 15 のグラフ

2021年AIインデックスレポートは、スタンフォード大学の人間中心AI研究所と、ハーバード大学、経済...

脚付きロボットの新たなスキル:ANYmalは山登りを学んでいる

ロボット工学の研究者がここ数年で脚付きロボットで成し遂げたことは実に驚くべきことだ。昨年7月、オレゴ...

ファイザーはAIとスーパーコンピューターを活用してコロナウイルスのワクチンと薬を設計している

ファイザーの最高デジタル・技術責任者リディア・フォンセカ氏は、機械学習技術は医薬品の発見、臨床試験、...