Gumbo.jl

Gumbo.jlはJulia言語でHTMLをパース(構文解析)するためのパッケージである。

GumboはHTML5解析ライブラリであり、Googleが提供している。Gumbo.jlはGumboのJuliaラッパーである。

パッケージの追加

Gumbo.jlを使用するには、Julia言語にGumboパッケージを追加する必要がある。

Gumboパッケージを追加するには、JuliaのREPLを起動して、Pkgパッケージのadd()関数を実行する。

julia> using Pkg
julia> Pkg.add("Gumbo")

パッケージの追加は、Juliaインストール後に1度だけ行えばよい。パッケージを使うたびに追加する必要はない。

パッケージを追加せずにGumboを使おうとすると、次のようなエラーメッセージが出力される。

julia> using Gumbo
ERROR: ArgumentError: Package Gumbo not found in current path:
- Run `import Pkg; Pkg.add("Gumbo")` to install the Gumbo package.

Stacktrace:
 [1] require(into::Module, mod::Symbol)
   @ Base .\loading.jl:871

パッケージのロード

Gumbo パッケージを使用するためには、using キーワードで Gumbo パッケージをロードする必要がある。

julia> using Gumbo

HTMLDocument

HTMLDocument は parsehtml の呼び出しから返されるもので、パースされたドキュメントの doctype フィールドと、ドキュメントのルートへの参照である root フィールドを持っている。

HTMLElement

HTMLElementは、そのタグを表すシンボルによってパラメータ化されている。

mutable struct HTMLElement{T} <: HTMLNode
    children::Vector{HTMLNode}
    parent::HTMLNode
    attributes::Dict{String, String}
end

HTMLText

HTMLText はHTML文書に現れるテキストを表現する。

type HTMLText <: HTMLNode
    parent::HTMLNode
    text::String
end

parsehtml()

HTMLのパース(構文解析)は、parsehtml 関数で行う。

julia> using Gumbo

julia> doc = parsehtml("<title>Example</title>")
HTML Document:
<!DOCTYPE >
HTMLElement{:HTML}:<HTML>
  <head>
    <title>
      Example
    </title>
  </head>
  <body></body>
</HTML>

julia> doc.root
HTMLElement{:HTML}:<HTML>
  <head>
    <title>
      Example
    </title>
  </head>
  <body></body>
</HTML>

julia> doc.root[1]
HTMLElement{:head}:<head>
  <title>
    Example
  </title>
</head>

julia> doc.root[1][1]
HTMLElement{:title}:<title>
  Example
</title>

julia> doc.root[2]
HTMLElement{:body}:<body></body>

HTMLDocumentのrootフィールドは次の構造となる。

tag(element)

この要素のタグをシンボルとして取得する。

julia> using Gumbo

julia> doc = parsehtml("<title>Example</title>")
HTML Document:
<!DOCTYPE >
HTMLElement{:HTML}:<HTML>
  <head>
    <title>
      Example
    </title>
  </head>
  <body></body>
</HTML>

julia> tag(doc.root[1])
:head

attrs(element)

この要素の属性をDictで返す。

children(element)

この要素の子を配列で取得する。

julia> using Gumbo

julia> doc = parsehtml("<title>Example</title>")
HTML Document:
<!DOCTYPE >
HTMLElement{:HTML}:<HTML>
  <head>
    <title>
      Example
    </title>
  </head>
  <body></body>
</HTML>

julia> children(doc.root[1])
1-element Vector{HTMLNode}:
 HTMLElement{:title}:<title>
  Example
</title>

getattr(element, name)

name で指定した属性の値を取得する。

指定した属性が存在しない場合、KeyErrorをスローする。

julia> using Gumbo

julia> doc = parsehtml("<title>Example</title>")
HTML Document:
<!DOCTYPE >
HTMLElement{:HTML}:<HTML>
  <head>
    <title>
      Example
    </title>
  </head>
  <body></body>
</HTML>

julia> getattr(doc.root[1], "id")
ERROR: KeyError: key "id" not found

getattr(element, name, default)

name で指定した属性の値を取得する。

指定した属性が存在しない場合、default で指定した値を返す。

julia> using Gumbo

julia> doc = parsehtml("<title>Example</title>")
HTML Document:
<!DOCTYPE >
HTMLElement{:HTML}:<HTML>
  <head>
    <title>
      Example
    </title>
  </head>
  <body></body>
</HTML>

julia> getattr(doc.root[1], "id", "foo")
"foo"

setattr!(element, name, value)

name で指定した属性に、value で指定した値を設定する。

参考文献

Porter, James. (2021). JuliaWeb / Gumbo.jl