Gumbo.jl

Gumbo.jl は Julia 言語で HTML をパース(構文解析)するためのパッケージである。Gumbo は HTML5 解析ライブラリであり、Google が提供している。Gumbo.jl は Gumbo の Julia ラッパーである。

目次

  1. 1 パッケージ
    1. 1.1 追加
    2. 1.2 ロード
  2. 2 Types
    1. 2.1 HTMLDocument
    2. 2.2 HTMLElement
    3. 2.3 HTMLText
  3. 3 Function
    1. 3.1 parsehtml
    2. 3.2 tag
    3. 3.3 attrs
    4. 3.4 children
    5. 3.5 getattr
    6. 3.6 setattr!

パッケージの追加

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 フィールドを持っている。

HTMLDocumentのフィールド
フィールド
doctype String
root HTMLElement{:HTML}

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は次の構造となる。

HTMLDocumentの例
フィールド 内容
HTMLDocument.doctype String html
HTMLDocument.root HTMLElement{:HTML}
<HTML>
  <head>
    <title>
      Example
    </title>
  </head>
  <body></body>
</HTML>
HTMLDocument.root[1] HTMLElement{:head}
<head>
  <title>
    Example
  </title>
</head>
HTMLDocument.root[1][1] HTMLElement{:title}
<title>
  Example
</title>
HTMLDocument.root[2] HTMLElement{:body}
<body></body>

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

HTMLDocumentの例
内容
tag(HTMLDocument.root) :HTML
<HTML>
  <head>
    <title>
      Example
    </title>
  </head>
  <body></body>
</HTML>
tag(HTMLDocument.root[1]) :head
<head>
  <title>
    Example
  </title>
</head>
tag(HTMLDocument.root[1][1]) :title
<title>
  Example
</title>
tag(HTMLDocument.root[2]) :body
<body></body>

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