这是一个精简的 HTML 解析器,具有充足的优化空间。
它使用 libxml2 将 HTML 字符串解析为纯 Swift 树,而不是简单地封装 libxml2 树。
当您使用一些 HTML 调用 Parser.parse
时,您会得到一个由 MutableElementNode
和 MutableTextNode
组成的可变树。 这些是允许您操作树的引用类型。 如果您想要值语义,则可以在树上调用 immutableCopy()
以将其作为结构体获取。
let parser = Parser(html: """
<div>
<div class="container">
<h1>Hi it's lil tidy</h1>
<article>
<p class="one two">hello</p>
<p>world</p>
</article>
<footer>
<p>it's the footer</p>
</footer>
</div>
</div>
""")
// Get an ElementNode
let parsed = try parser.parse().get()
// Search for tags
let paragraphs = parsed.find(.p)
XCTAssertEqual(3, paragraphs.count) // Passes!
// Search for tags inside tags
let footerParagraphs = parsed.find(.p, in: [.footer])
XCTAssertEqual(1, footerParagraphs.count) // Passes!
// Search by attribute
let firstParagraph = parsed.find(attributes: ["class": .contains("one")])
XCTAssertEqual(1, firstParagraph.count) // Passes!