我一直在研究Nokogiri源代码,但还没有得到Nokogiri如何将字符串解析为Elements。源代码可以在这里找到:
https://github.com/sparklemotion/nokogiri/tree/master/lib/nokogiri
例如:我有一个字符串:
raw = "<html> <body> body <div>this is div </div> </body> <html>"
Nokogiri::HTML(raw)
=>
#(Document:0x4d0c786 {
name = "document",
children = [
#(DTD:0x4d0bc6e { name = "html" }),
#(Element:0x4cfa46e {
name = "html",
children = [
#(Element:0x4cf9bfe {
name = "body",
children = [
#(Text "body"),
#(Element:0x4cf9348 {
name = "div",
children = [ #(Text "this is div")]
})]
})]
})]
})
我查看了nokogiri / lib / nokogiri / xml / sax
,我没有看到它如何解释html字符串。当我尝试阅读源代码时,我意识到在上面的输出中有数据类型Element
,但我没有看到源代码中的任何地方声明class Element
。
一般来说,任何人都可以帮我解释一下Nokogiri如何将字符串解析为上面的数据结构?
答案 0 :(得分:2)
如上所述,Nokogiri使用libxml2来处理实际的解析。这是使用本机(读取:C编码)Ruby扩展来完成的。 Ruby有一个well documented标准接口,用于构建本机扩展。 Here is a good guide