xmlua.HTMLSAXParser クラス

概要

このクラスは、SAX(Simple API for XML)を使ってHTMLをパースするクラスです。

SAXは、DOMと異なりドキュメントを一行ずつパースし、DOMはすべてのドキュメントをメモリに読み込んだあとにパースを行います。そのため、SAXはDOMと比べて少ないメモリで高速に動作します。

このクラスを使って、以下のイベントが起こった際に呼ばれるコールバックメソッドを登録できます。

コールバックイベント一覧:

クラスメソッド

xmlua.HTMLSAXParser.new() -> HTMLSAXParser

HTMLSAXParser オブジェクトを作成します。

以下の例のように、xmlua.HTMLSAXParserクラスのオブジェクトを作成できます。

例:

local xmlua = require("xmlua")

local parser = xmlua.HTMLSAXParser.new()

インスタンスメソッド

parse(html) -> boolean

html: パース対象のHTML文字列。

与えられたHTMLをパースします。HTMLのパースが成功した場合は、このメソッドはtrueを返します。HTMLのパースに失敗した場合は、falseを返します。

例:

local xmlua = require("xmlua")

-- パース対象のHTML
local html = [[
<html>
  <body>
    <p>Hello</p>
  </body>
</html>
]]

-- ファイル内のテキストをパースしたい場合は
-- 自分でファイルの内容を読み込む必要があります。

-- local html = io.open("example.html"):read("*all")

-- SAXを使ってHTMLをパースする。
local parser = xmlua.HTMLSAXParser.new()
local success = parser:parse(html)
if not success then
  print("Failed to parse HTML with SAX")
  os.exit(1)
end

finish() -> boolean

SAXを使ったHTMLのパースを終了します。

parseを使ってパースを開始した場合は、パース完了後にこのメソッドを呼ぶ必要があります。

このメソッドを呼ばないと、end_documentイベントは発生しません。

例:

local xmlua = require("xmlua")

-- パース対象のHTML
local html = [[
<html>
  <body>
    <p>Hello</p>
  </body>
</html>
]]

-- ファイル内のテキストをパースしたい場合は
-- 自分でファイルの内容を読み込む必要があります。

-- local html = io.open("example.html"):read("*all")

-- SAXを使ってHTMLをパースする。
local parser = xmlua.HTMLSAXParser.new()
local success = parser:parse(html)
if not success then
  print("Failed to parse HTML with SAX")
  os.exit(1)
end

parser:finish()

プロパティ

start_document

以下のようにコールバック関数を登録できます。

local parser = xmlua.HTMLSAXParser.new()
parser.start_document = function()
  -- 実行したいコード
end

document要素のパースを開始したときに、登録した関数が呼び出されます。

以下の例だと、<html>をパースしたときに、登録した関数が呼び出されます。

例:

local xmlua = require("xmlua")

-- パース対象のHTML
local html = [[
<html>
  <body>
    <p>Hello</p>
  </body>
</html>
]]

-- ファイル内のテキストをパースしたい場合は
-- 自分でファイルの内容を読み込む必要があります。

-- local html = io.open("example.html"):read("*all")

-- SAXを使ってHTMLをパースする。
local parser = xmlua.HTMLSAXParser.new()
parser.start_document = function()
  print("Start document")
end
local success = parser:parse(html)
if not success then
  print("Failed to parse HTML with SAX")
  os.exit(1)
end

parser:finish()

上記の例の結果は以下のようになります。

Start document

end_document

以下のようにコールバック関数を登録できます。

local parser = xmlua.HTMLSAXParser.new()
parser.end_document = function()
  -- You want to execute code
end

finishが呼ばれたときに、登録したコールバック関数が呼び出されます。

以下の例では、parser:finish()を実行したときに登録した関数が呼び出されます。

例:

local xmlua = require("xmlua")

-- パース対象のHTML
local html = [[
<html>
  <body>
    <p>Hello</p>
  </body>
</html>
]]

-- ファイル内のテキストをパースしたい場合は
-- 自分でファイルの内容を読み込む必要があります。

-- local html = io.open("example.html"):read("*all")

-- Parses HTML with SAX
local parser = xmlua.HTMLSAXParser.new()
parser.end_document = function()
  print("End document")
end
local success = parser:parse(html)
if not success then
  print("Failed to parse HTML with SAX")
  os.exit(1)
end

parser:finish()

上記の例の結果は以下のようになります。

End document

processing_instruction

以下のようにコールバック関数を登録できます。

コールバック関数の引数として、Processing instruction要素の属性を取得することができます。Processing Instruction要素の属性は、以下の例では、targetdata_listです。

local parser = xmlua.HTMLSAXParser.new()
parser.processing_instruction = function(target, data_list)
  -- You want to execute code
end

Processing Instruction要素が解析されたときに、登録したコールバック関数が呼び出されます。

以下の例では、<?target This is PI>をパースした際に登録した関数が呼び出されます。

例:

local xmlua = require("xmlua")

-- HTML to be parsed
local html = [[
<html>
  <?target This is PI>
  <body>
    <p>Hello</p>
  </body>
</html>
]]

-- ファイル内のテキストをパースしたい場合は
-- 自分でファイルの内容を読み込む必要があります。

-- local html = io.open("example.html"):read("*all")

-- Parses HTML with SAX
local parser = xmlua.HTMLSAXParser.new()
parser.processing_instruction = function(target, data_list)
  print("Processing instruction target: "..target)
  print("Processing instruction data: "..data_list)
end
local success = parser:parse(html)
if not success then
  print("Failed to parse HTML with SAX")
  os.exit(1)
end

parser:finish()

上記の例の結果は以下のようになります。

Processing instruction target: target
Processing instruction data: This is PI

cdata_block

以下のようにコールバック関数を登録できます。

コールバック関数の引数として、script要素の属性を取得できます。以下の例では、script要素の属性は、cdata_blockです。

local parser = xmlua.HTMLSAXParser.new()
parser.cdata_block = function(cdata_block)
  -- You want to execute code
end

script要素をパースしたときに、登録した関数が呼び出されます。

以下の例では、<script>alert(\"Hello world!\")</script>をパースしたときに、登録した関数が呼び出されます。

例:

local xmlua = require("xmlua")

-- HTML to be parsed
local html = [[
<html>
  <body>
    <p>Hello</p>
  </body>
  <script>alert(\"Hello world!\")</script>
</html>
]]

-- ファイル内のテキストをパースしたい場合は
-- 自分でファイルの内容を読み込む必要があります。

-- local html = io.open("example.html"):read("*all")

-- Parses HTML with SAX
local parser = xmlua.HTMLSAXParser.new()
parser.cdata_block = function(cdata_block)
  print("CDATA block: "..cdata_block)
end
local success = parser:parse(html)
if not success then
  print("Failed to parse HTML with SAX")
  os.exit(1)
end

parser:finish()

上記の例の結果は以下のようになります。

CDATA block: alert(\"Hello world!\")

ignorable_whitespace

以下のようにコールバック関数を登録できます。

コールバック関数の引数として、HTML内の無視できる空白を取得することができます。以下の例では、無視できる空白は、ignorable_whitespaceです。

local parser = xmlua.HTMLSAXParser.new()
parser.ignorable_whitespace = function(ignorable_whitespace)
  -- You want to execute code
end

無視できる空白をパースしたときに、登録した関数が呼び出されます。

例:

local xmlua = require("xmlua")

-- HTML to be parsed
local html = [[
<html> <body><p>Hello</p></body> </html>
]]

-- ファイル内のテキストをパースしたい場合は
-- 自分でファイルの内容を読み込む必要があります。

-- local html = io.open("example.html"):read("*all")

-- Parses HTML with SAX
local parser = xmlua.HTMLSAXParser.new()
parser.ignorable_whitespace = function(ignorable_whitespace)
  print("Ignorable whitespace: ".."\""..ignorable_whitespace.."\"")
end
local success = parser:parse(html)
if not success then
  print("Failed to parse HTML with SAX")
  os.exit(1)
end

parser:finish()

上記の例の結果は以下のようになります。

Ignorable whitespace: " "
Ignorable whitespace: " "
Ignorable whitespace: "
"

comment

以下のようにコールバック関数を登録できます。

コールバック関数の引数として、HTML内のコメントを取得できます。以下の例では、commentがHTML内のコメントです。

local parser = xmlua.HTMLSAXParser.new()
parser.comment = function(comment)
  -- You want to execute code
end

HTMLのコメントをパースしたときに、登録した関数が呼び出されます。

例:

local xmlua = require("xmlua")

-- HTML to be parsed
local html = [[
<html>
<!--This is comment.-->
  <body>
    <p>Hello</p>
  </body>
</html>
]]

-- ファイル内のテキストをパースしたい場合は
-- 自分でファイルの内容を読み込む必要があります。

-- local html = io.open("example.html"):read("*all")

-- Parses HTML with SAX
local parser = xmlua.HTMLSAXParser.new()
parser.comment = function(comment)
  print("Comment: "..comment)
end
local success = parser:parse(html)
if not success then
  print("Failed to parse HTML with SAX")
  os.exit(1)
end

parser:finish()

上記の例の結果は以下のようになります。

Comment:  This is comment.

start_element

以下のようにコールバック関数を登録できます。

コールバック関数の引数として、要素の名前と属性を取得できます。

local parser = xmlua.HTMLSAXParser.new()
parser.start_element = function(local_name, attributes)
  -- You want to execute code
end

要素をパースしたときに、登録した関数が呼び出されます。

例:

local xmlua = require("xmlua")

-- HTML to be parsed
local html = [[
<html id="top" class="top-level">
  <body>
    <p>Hello</p>
  </body>
</html>
]]

-- ファイル内のテキストをパースしたい場合は
-- 自分でファイルの内容を読み込む必要があります。

-- local html = io.open("example.html"):read("*all")

-- Parses HTML with SAX
local parser = xmlua.HTMLSAXParser.new()
parser.start_element = function(local_name, attributes)
  print("Start element: " .. local_name)
  if #attributes > 0 then
    print("  Attributes:")
    for i, attribute in pairs(attributes) do
      local name
      if attribute.prefix then
        name = attribute.prefix .. ":" .. attribute.local_name
      else
        name = attribute.name
      end
      if attribute.uri then
        name = name .. "{" .. attribute.uri .. "}"
      end
      print("    " .. name .. ": " .. attribute.value)
    end
  end
end

local success = parser:parse(html)
if not success then
  print("Failed to parse HTML with SAX")
  os.exit(1)
end

parser:finish()

上記の例の結果は以下のようになります。

Start element: html
  Attributes:
    id: top
    class: top-level
Start element: body
Start element: p

end_element

以下のようにコールバック関数を登録できます。

コールバック関数の引数として、要素の名前を取得できます。

local parser = xmlua.HTMLSAXParser.new()
parser.end_element = function(name)
  -- You want to execute code
end

要素の終わりをパースしたときに、登録した関数が呼び出されます。

例:

local xmlua = require("xmlua")

-- HTML to be parsed
local html = [[
<html id="top" class="top-level">
  <body>
    <p>Hello</p>
  </body>
</html>
]]

-- ファイル内のテキストをパースしたい場合は
-- 自分でファイルの内容を読み込む必要があります。

-- local html = io.open("example.html"):read("*all")

-- Parses HTML with SAX
local parser = xmlua.HTMLSAXParser.new()
parser.end_element = function(name)
  print("End element: " .. name)
end

local success = parser:parse(html)
if not success then
  print("Failed to parse HTML with SAX")
  os.exit(1)
end

parser:finish()

上記の例の結果は以下のようになります。

End element: p
End element: body
End element: html

text

以下のようにコールバック関数を登録できます。

コールバック関数の引数として、text要素の値を取得できます。

local parser = xmlua.HTMLSAXParser.new()
parser.text = function(text)
  -- You want to execute code
end

text要素をパースしたときに、登録した関数が呼び出されます。

例:

local xmlua = require("xmlua")

-- HTML to be parsed
local html = [[
<html><body><p>Hello</p></body></html>
]]

-- ファイル内のテキストをパースしたい場合は
-- 自分でファイルの内容を読み込む必要があります。

-- local html = io.open("example.html"):read("*all")

-- Parses HTML with SAX
local parser = xmlua.HTMLSAXParser.new()
parser.text = function(text)
  print("Text: " .. text)
end

local success = parser:parse(html)
if not success then
  print("Failed to parse HTML with SAX")
  os.exit(1)
end

parser:finish()

上記の例の結果は以下のようになります。

Text: Hello

error

以下のようにコールバック関数を登録できます。

コールバック関数の引数として、エラー情報を取得できます。

local parser = xmlua.HTMLSAXParser.new()
parser.error = function(error)
  -- You want to execute code
end

パースが失敗したときに、登録した関数が呼び出されます。エラー情報の構造は以下の通りです。

{
  domain
  code
  message
  level
  line
}

domainの値は、Error domain 一覧に定義されています。

codeの値は、Error code 一覧に定義されています。

levelの値は、Error level 一覧に定義されています。

例:

local xmlua = require("xmlua")

-- HTML to be parsed
local html = [[
<>
]]

-- ファイル内のテキストをパースしたい場合は
-- 自分でファイルの内容を読み込む必要があります。

-- local html = io.open("example.html"):read("*all")

-- Parses HTML with SAX
local parser = xmlua.HTMLSAXParser.new()
parser.error = function(error)
  print("Error domain : " .. error.domain)
  print("Error code   : " .. error.code)
  print("Error message: " .. error.message)
  print("Error level  : " .. error.level)
  print("Error line   : " .. error.line)
end

local success = parser:parse(html)
if not success then
  print("Failed to parse HTML with SAX")
  os.exit(1)
end

parser:finish()

上記の例の結果は以下のようになります。

Error domain : 5
Error code   : 68
Error message: htmlParseStartTag: invalid element name

Error level  : 2
Error line   : 1
Failed to parse HTML with SAX