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 は parsehtml の呼び出しから返されるもので、パースされたドキュメントの doctype フィールドと、ドキュメントのルートへの参照である root フィールドを持っている。
フィールド | 型 |
---|---|
doctype | String |
root | HTMLElement{:HTML} |
HTMLElementは、そのタグを表すシンボルによってパラメータ化されている。
mutable struct HTMLElement{T} <: HTMLNode
children::Vector{HTMLNode}
parent::HTMLNode
attributes::Dict{String, String}
end
HTMLText はHTML文書に現れるテキストを表現する。
type HTMLText <: HTMLNode
parent::HTMLNode
text::String
end
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は次の構造となる。
フィールド | 型 | 内容 |
---|---|---|
HTMLDocument.doctype |
String |
html |
HTMLDocument.root |
HTMLElement{:HTML} |
|
HTMLDocument.root[1] |
HTMLElement{:head} |
|
HTMLDocument.root[1][1] |
HTMLElement{:title} |
|
HTMLDocument.root[2] |
HTMLElement{:body} |
|
この要素のタグをシンボルとして取得する。
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
式 | 値 | 内容 |
---|---|---|
tag(HTMLDocument.root) |
:HTML |
|
tag(HTMLDocument.root[1]) |
:head |
|
tag(HTMLDocument.root[1][1]) |
:title |
|
tag(HTMLDocument.root[2]) |
:body |
|
この要素の属性をDictで返す。
この要素の子を配列で取得する。
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>
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
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"
name で指定した属性に、value で指定した値を設定する。
Porter, James. (2021). JuliaWeb / Gumbo.jl