Jestem nowicjuszem Swift. Potrzebuję czegoś takiego jak BeautifulSoup Pythona w projekcie Swift iOS. Dokładnie, muszę uzyskać wszystkie href
z <a>
, które kończą się ".txt"
. Jakie kroki powinienem podjąć?Jaka jest najlepsza praktyka do szybkiego analizowania html?
Odpowiedz
Istnieje kilka ładne biblioteki z HTML Parsing przy użyciu Swift
i Objective-C
, podobnie jak następujące:
Spójrz w poniższych przykładach w czterech bibliotekach zamieszczonych powyżej, głównie analizowana z wykorzystaniem 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 i CS selektory):
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)
}
}
}
fuži (xPath i CS selektorów):
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)
}
Funkcja ends-with
jest częścią Xpath 2.0.
SwiftSoup (selektory 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")
}
Mam nadzieję, że to pomaga.
można spróbować tej SWIFT-parser HTML:
https://github.com/tid-kijyun/Swift-HTML-Parser
To bardzo pomaga.
I coraz HTML z txt można:
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)
Edit:
Aby uzyskać to, czego potrzeba można użyć jako exemple:
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
}
}
Dziękuję. Nie muszę wyodrębniać html z txt. Potrzebuję wyodrębnić .txt hrefs z html przez twój parser: 'Da TXT -> http: // foo.com/bar.txt' – amazingbasil
@amazingbasil Zmontowałem swoją odpowiedź, mam nadzieję, że ci to pomoże. :) –
Wypróbuj SwiftSoup, port jsoup do 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"))
}
Dobra robota, Dokumentacja może być trochę jasne. Aktualne informacje nie wystarczą, aby zacząć. Jak wykonać Akcje za pomocą obiektu dokumentu i za pomocą formularzy będzie świetnym początkiem –
@m Inna dokumentacja znajduje się w sekcji Wiki, ale ja ją piszę. – Scinfu
@Scinfu: Czy obsługuje Swift 2? – user484691
- 1. Jaka jest najlepsza praktyka przy logowaniu do Umbraco?
- 2. Jaka jest najlepsza praktyka organizowania aplikacji jQuery Mobile?
- 3. jaka jest najlepsza praktyka przy łączeniu Hive Połączenia JDBC
- 4. Jaka jest najlepsza praktyka wdrażania przy korzystaniu z MODX?
- 5. JavaScript specyficzny dla strony Railsów: jaka jest najlepsza praktyka?
- 6. Jaka jest najlepsza praktyka w obsłudze wyjątków w silverlight?
- 7. Najlepsza praktyka tworzenia szablonu w HTML
- 8. Jaka jest najlepsza praktyka w zapytaniach o media w CSS3?
- 9. jaka jest najlepsza praktyka implementacji i18n use java?
- 10. jaka jest najlepsza praktyka obsługi czasu w R?
- 11. Jaka jest najlepsza praktyka profilowania aplikacji Native React Native?
- 12. NHibernate - najlepsza praktyka do wybrania tylko
- 13. Szyny: najlepsza praktyka do przechowywania ustawień użytkownika?
- 14. Najlepsza praktyka do aktualizacji serwera gier online?
- 15. Najlepsza praktyka uzyskiwania EntityManagerFactory
- 16. Najlepsza praktyka do dokumentowania zależności bibliotek javascript
- 17. Najlepsza praktyka nazywania podklas
- 18. najlepsza praktyka architektury phonegap
- 19. Najlepsza praktyka projektowania formularzy PHP
- 20. Jaka jest najlepsza struktura rozwiązania MVC3?
- 21. Obsada void do typedef (najlepsza praktyka)
- 22. Zarządzanie wersjami - najlepsza praktyka
- 23. Zastąpić Ext.data.Connection - najlepsza praktyka
- 24. Najlepsza praktyka parametryzowania aplikacji GWT?
- 25. Najlepsza praktyka C++: Powracanie do obiektu referencyjnego
- 26. Najlepsza praktyka do deklarowania pustych zmiennych javascript
- 27. Jaka jest najlepsza praktyka, jeśli chodzi o przechowywanie zdjęć do galerii?
- 28. Jaka jest najlepsza praktyka wysyłania logów do graylog z aplikacji JVM, która działa w kontenerze dokowania?
- 29. Jaka jest najlepsza praktyka uzyskiwania instancji EC2 automatycznie dołączających do HAProxy?
- 30. Jaka jest najlepsza praktyka uzyskiwania dostępu do wartości $ _GET w Laravel?
.. nazwa "Swift-HTML-Parser" to teraz Kanna (鉋) –
@FrancoRondini Dzięki za obserwację, odpowiedź na bieżąco :) –
Dostaję "niejednoznaczne użycie init (HTMLData:)" przez cały czas. Próbowałem bawić się z 'as!' I ':' i wszystkim, ale nie mogę tego uruchomić. Jakieś pomysły? Nienawidzę szybkiego – user2161301