golangクエリhtml

WBOY
WBOYオリジナル
2023-05-19 10:46:07738ブラウズ

まえがき

プログラミング言語の発展は、私たちに無限の可能性をもたらしました。最新のプログラミング言語である Go 言語は、効率性、シンプルさ、クロスプラットフォームなどの多くの利点を備えており、サーバーサイド プログラミング、クラウド コンピューティング、コンテナーなどの分野で広く使用されています。この記事では、サードパーティのライブラリを使用して Go で HTML ドキュメントをクエリする方法を紹介します。

1. Go 言語と HTML

HTML は、Web ページの構築に使用されるマークアップ言語です。要素の構造とスタイルを指定し、CSS や JavaScript などの他のテクノロジとともに使用して、複雑なインタラクティブな効果を実現できます。 Go 言語は、コンパイルされ、静的に型指定され、同時実行安全なプログラミング言語であり、その効率性で知られています。 Go 言語自体は HTML 解析を直接サポートしていませんが、サードパーティのライブラリを使用することでこのタスクを実行できます。

2. Go 言語での HTML 解析

Go 言語では、golang.org/x/net/html# などのさまざまなツールを使用して HTML ドキュメントを解析できます。 ##、github.com/PuerkitoBio/goquery など。これらのツールは、HTML ドキュメントの解析、走査、および変更のための一連のメソッドと構造を提供します。

2.1

golang.org/x/net/html

golang.org/x/net/html を使用します。これは Go 言語によって提供されます。 HTML ドキュメントを解析するための豊富な API を提供する標準ライブラリ。次に、ライブラリを使用して HTML ドキュメント内のノード データをクエリする方法を示します。

以下は単純な HTML ドキュメントです:

<!DOCTYPE html>
<html>
  <head>
    <title>A Simple HTML Document</title>
  </head>
  <body>
    <h1>This is a heading</h1>
    <p>This is a paragraph.</p>
    <p>This is another paragraph.</p>
  </body>
</html>

次に、このドキュメント内のすべての段落ノード (

e388a4556c0f65e1904146cc1a846bee タグ) のテキスト コンテンツをクエリしたいとします。まず、HTML ドキュメントを DOM ツリー構造に解析し、DOM ツリーを再帰的に走査してノード データをクエリする必要があります。

package main

import (
    "fmt"
    "golang.org/x/net/html"
    "strings"
)

var htmlString = `
<!DOCTYPE html>
<html>
  <head>
    <title>A Simple HTML Document</title>
  </head>
  <body>
    <h1>This is a heading</h1>
    <p>This is a paragraph.</p>
    <p>This is another paragraph.</p>
  </body>
</html>
`

func main() {
    reader := strings.NewReader(htmlString)
    doc, err := html.Parse(reader)
    if err != nil {
        fmt.Println("Failed to parse HTML string:", err)
        return
    }
    var find func(*html.Node)
    find = func(n *html.Node) {
        if n.Type == html.ElementNode && n.Data == "p" {
            fmt.Println(n.FirstChild.Data)
        } else {
            for c := n.FirstChild; c != nil; c = c.NextSibling {
                find(c)
            }
        }
    }
    find(doc)
}

上記のコードでは、

strings.NewReader() を使用して文字列を io.Reader インターフェイス型に変換し、それを html.Parse() HTML文書を解析する関数。次に、find() という名前の再帰関数を定義して、DOM ツリーを走査し、条件を満たすノードを見つけます。段落ノードが見つかると、そのノードのテキスト コンテンツが出力されます。最後に、find() 関数を呼び出して、すべての段落ノードのテキスト コンテンツをクエリして出力します。

2.2

github.com/PuerkitoBio/goquery

github.com/PuerkitoBio/goquery は非常に人気のある Go 言語ライブラリです。 HTML の解析とクエリを実行するためのシンプルで便利な方法です。 goquery を使用すると、DOM ツリーの構造を深く掘り下げることなく、HTML ドキュメントを走査してクエリを実行できます。

以下はサンプル HTML ドキュメントです:

<!DOCTYPE html>
<html>
  <head>
    <title>A Simple HTML Document</title>
  </head>
  <body>
    <h1>This is a heading</h1>
    <p>This is a paragraph.</p>
    <p>This is another paragraph.</p>
  </body>
</html>

次に、ドキュメント内のすべての段落ノードのテキスト コンテンツをクエリしたいと思います。これは、

goquery を使用すると簡単に実現できます。 :

package main

import (
    "fmt"
    "github.com/PuerkitoBio/goquery"
    "strings"
)

var htmlString = `
<!DOCTYPE html>
<html>
  <head>
    <title>A Simple HTML Document</title>
  </head>
  <body>
    <h1>This is a heading</h1>
    <p>This is a paragraph.</p>
    <p>This is another paragraph.</p>
  </body>
</html>
`

func main() {
    reader := strings.NewReader(htmlString)
    doc, err := goquery.NewDocumentFromReader(reader)
    if err != nil {
        fmt.Println("Failed to parse HTML string:", err)
        return
    }
    doc.Find("p").Each(func(i int, s *goquery.Selection) {
        fmt.Println(s.Text())
    })
}

上記のコードでは、

strings.NewReader() を使用して文字列を io.Reader インターフェイス型に変換し、それを goquery.NewDocumentFromReader() に渡します。 HTML ドキュメントを解析する 関数。次に、doc.Find("p") を使用してすべての段落ノードをクエリし、s.Text() メソッドを通じてそのテキスト コンテンツを出力します。

3. 概要

この記事では、Go 言語で HTML ドキュメントのコンテンツをクエリする方法を紹介します。

golang.org/x/net/htmlgithub.com/PuerkitoBio/goquery を使用した 2 つの異なるアプローチを検討しました。これらのツールは、HTML ドキュメントを解析できるだけでなく、DOM ツリーを走査して操作するための豊富な API も提供します。どの方法を選択しても、HTML ドキュメントからデータを簡単に取得できるため、よりエレガントで効率的なアプリケーションを構築できます。

以上がgolangクエリhtmlの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。