当前位置: 首页 > 面试题库 >

快速解析html的最佳实践是什么?

牟星火
2023-03-14
问题内容

我是Swift新手。我需要类似SwiftiOS项目中Python的BeautifulSoup之类的东西。准确地说,我需要将所有这些都href<a>结尾".txt"。我应该采取什么步骤?


问题答案:

有几个不错的 HTML解析 库,它们使用SwiftObjective-C如下所示:

  • hpple
  • NDHpple
  • Kanna( old Swift-HTML-Parser)
  • Fuzi
  • SwiftSoup
  • Ji

看一下上面发布的四个库中的以下示例,这些示例主要是使用XPath 2.0进行解析的:

hpple

let data = NSData(contentsOfFile: path)
let doc = TFHpple(htmlData: data)

if let elements = doc.searchWithXPathQuery("//a/@href[ends-with(.,'.txt')]") as? [TFHppleElement] {
   for element in elements {
       println(element.content)
   }
}

NDHpple

let data = NSData(contentsOfFile: path)!
let html = NSString(data: data, encoding: NSUTF8StringEncoding)!
let doc = NDHpple(HTMLData: html)
if let elements = doc.searchWithXPathQuery("//a/@href[ends-with(.,'.txt')]") {
   for element in elements {
     println(element.children?.first?.content)
   }
}

Kanna (Xpath and CSS Selectors):

let html = "<html><head></head><body><ul><li><input type='image' name='input1' value='string1value' class='abc' /></li><li><input type='image' name='input2' value='string2value' class='def' /></li></ul><span class='spantext'><b>Hello World 1</b></span><span class='spantext'><b>Hello World 2</b></span><a href='example.com'>example(English)</a><a href='example.co.jp'>example(JP)</a></body>"

if let doc = Kanna.HTML(html: html, encoding: NSUTF8StringEncoding) {
   var bodyNode   = doc.body

   if let inputNodes = bodyNode?.xpath("//a/@href[ends-with(.,'.txt')]") {
      for node in inputNodes {
         println(node.contents)
      }
   }
}

Fuzi(Xpath and CSS Selectors)

let html = "<html><head></head><body><ul><li><input type='image' name='input1' value='string1value' class='abc' /></li><li><input type='image' name='input2' value='string2value' class='def' /></li></ul><span class='spantext'><b>Hello World 1</b></span><span class='spantext'><b>Hello World 2</b></span><a href='example.com'>example(English)</a><a href='example.co.jp'>example(JP)</a></body>"

do {
  // if encoding is omitted, it defaults to NSUTF8StringEncoding
  let doc = try HTMLDocument(string: html, encoding: NSUTF8StringEncoding)

  // XPath queries
  for anchor in doc.xpath("//a/@href[ends-with(.,'.txt')]") {
    print(anchor.stringValue)
  }

} catch let error {
    print(error)
}

ends-with功能是Xpath 2.0的一部分。

SwiftSoup(CSS Selectors)

do{
    let doc: Document = try SwiftSoup.parse("...")
    let links: Elements = try doc.select("a[href]") // a with href
    let pngs: Elements = try doc.select("img[src$=.png]")

    // img with src ending .png
    let masthead: Element? = try doc.select("div.masthead").first()

    // div with class=masthead
    let resultLinks: Elements? = try doc.select("h3.r > a") // direct a after h3
} catch Exception.Error(let type, let message){
    print(message)
} catch {
   print("error")
}

Ji(XPath)

let jiDoc = Ji(htmlURL: URL(string: "http://www.apple.com/support")!)
let titleNode = jiDoc?.xPath("//head/title")?.first
print("title: \(titleNode?.content)") // title: Optional("Official Apple Support")

我希望这可以帮助你。



 类似资料:
  • 问题内容: 我刚开始学习Go,并通读现有代码以学习“其他人的做法”。在这种情况下,遍历使用go“工作区”,尤其是与项目依赖关系有关的地方。 在处理各种Go项目时,使用一个或多个Go工作区(即$ GOPATH的定义)的常见(或存在)最佳实践是什么?我应该期望有一个类似于我所有项目的中央代码存储库的Go工作区,还是在我处理这些项目时都明确将其分解并设置$ GOPATH(有点像python) virtu

  • 问题内容: 我正在构建一个基于expressjs的应用程序,我想在其中记录所有事件。我可以找到温斯顿,这似乎很酷。无论如何,我正在寻找一种方法将其连接到我的expressjs应用程序。 我还想要在应用程序内部登录。我的要求不是那么简单,所以我想将所有内容记录在我的应用程序中(不仅是请求)。 我目前的情况: server.js (我想在此级别记录http请求) 路线/something.js con

  • 问题内容: 用PHP完成这项工作时,可能会遇到这种问题: 问题是,如果包含双引号,应将其更改为 但这还不是全部故事: 在这种情况下,我们需要将单引号更改为,而将双引号保持不变。 那么,我们如何以一般财产的方式来做呢? 问题答案: 您始终希望对HTML属性中的内容进行HTML编码,您可以使用以下方法: 您可能需要将第二个参数()设置为。 唯一的潜在风险是可能已经被编码,因此您 可能 需要将最后一个参

  • 问题内容: 我正在寻找一种库/方法来解析比通用xml解析库具有更多html特定功能的html文件。 问题答案: 这是一个敏捷的HTML解析器,它构建了一个读/写DOM并支持纯XPATH或XSLT(您实际上不必了解XPATH或XSLT来使用它,不用担心…)。这是一个.NET代码库,可让您解析“网络外” HTML文件。该解析器对“真实世界”格式的HTML十分宽容。对象模型与提出System.Xml的对

  • 问题内容: 我目前正在我的app.js / server.js文件中提供我所有的html,如下所示: 我想如果我有15个以上的html页面,那可能不是调用它们的最佳方法。是否有更好的方法可以从另一个文件或位置为它们提供服务,并使用导出或仅能在app.js上调用一个函数或某些东西的服务。这可能是路由的目的,但也许我不太了解。 (添加了同一文件中的更多代码) 问题答案: 您可以使用中间件: 一个服务器

  • 这里有些给使用和编写 Ansible playbook 的贴士. 你能在我们的 ansible-example repository.找到展示这些最佳实践的 playbook 样例.(注意: 这些示例用的也许不是最新版的中所有特性,但它们仍旧是极佳的参考.) Topics 最佳实践 接下来的章节将向你展示一种组织 playbook 内容方式. 你对 Ansible 的使用应该符合你的需求而不是我们