html - tema - tecnologias para el desarrollo de aplicaciones web pdf
¿Cuál es la mejor práctica para analizar html en swift? (3)
Soy un novato Swift.
Necesito algo como el proyecto BeautifulSoup de Python en Swift para iOS.
Precisamente, necesito obtener todo
href
de
<a>
que termina con
".txt"
.
¿Cuáles son los pasos que debo seguir?
Hay varias bibliotecas agradables de
análisis HTML
usando
Swift
y
Objective-C
como las siguientes:
Eche un vistazo a los siguientes ejemplos en las cuatro bibliotecas publicadas anteriormente, analizadas principalmente con 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 (Selectores Xpath y CSS) :
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 (Selectores Xpath y CSS) :
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)
}
La función
ends-with
forma parte de
Xpath 2.0
.
SwiftSoup (Selectores CSS) :
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")
Espero que esto te ayude.
Prueba SwiftSoup , un puerto de jsoup a Swift.
let html: String = "<a id=1 href=''?foo=bar&mid<=true''>One</a> <a id=2 href=''?foo=bar<qux&lg=1''>Two</a>";
let els: Elements = try SwiftSoup.parse(html).select("a");
for element: Element in els.array(){
print(try element.attr("href"))
}
Puedes probar este swift-html-parser:
https://github.com/tid-kijyun/Swift-HTML-Parser
Esto ayuda mucho.
Y para obtener tu html de un txt puedes:
let file = "file.txt"
if let dirs : [String] = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.AllDomainsMask, true) as? [String] {
let dir = dirs[0] //documents directory
let path = dir.stringByAppendingPathComponent(file);
let html = String(contentsOfFile: path, encoding: NSUTF8StringEncoding, error: nil)
Editar:
Para obtener lo que necesita, puede usar como ejemplo:
import Foundation
let html = "theHtmlYouWannaParse"
var err : NSError?
var parser = HTMLParser(html: html, error: &err)
if err != nil {
println(err)
exit(1)
}
var bodyNode = parser.body
if let inputNodes = bodyNode?.findChildTags("b") {
for node in inputNodes {
println(node.contents)
}
}
if let inputNodes = bodyNode?.findChildTags("a") {
for node in inputNodes {
println(node.getAttributeNamed("href")) //<- Here you would get your files link
}
}