我在Swift中使用xpath-parser解析一个网站。该网站有多个页面具有相同的布局。
xpath就是这样:
//div[@class='views-row views-row-4 views-row-even']/div[@class='details']/div[@class='detailscontainer']//tr[7]/td[2]
它几乎适用于每个页面上的每个元素,但突然之间,xpath不会返回它应该的值。
我已经检查了带有chrome扩展名的xpath并且它是正确的。但是解析器找不到它。
例如,在this page它的体育馆Laufen'其中' Typ' row doesn&t; t(tr [7] / td 2)返回任何值(null-crash),但它应该,因为它与其他记录相同。
可疑也是,之前有些行正在运行。例如前4个。但更高的行通常不起作用。
我使用Kanna作为解析器。这是我的代码:
for site in 15...49{
var url = "https://bildungssystem.educa.ch/de/schools_in_ch?page=2%2C0%2C0%2C0%2C0%2C0%2C0%2C0%2C0%2C0%2C" + site.description + "&title=&field_eduinst_canton_value=All&field_eduinst_type_value=All&field_eduinst_school_grade_value=All&ahah_page_storage[page_build_id]=page-72cd2d0cc7ac814bba6bbfb0b0bc0a3e"
var urlRequest = NSURL(string: url)
var error:NSError?
let html = String(contentsOfURL: urlRequest!, encoding: NSUTF8StringEncoding, error: &error)
if let doc = Kanna.HTML(html: html!, encoding: NSUTF8StringEncoding) {
println(doc.title)
for school in 1...25{
if school == 22 && site == 49{
break
}
for td in 1...7{
println(doc.xpath("//div[@class='view-content']/div[starts-with(@class, 'views-row views-row-" + school.description + "')]/div[@class='details']/div[@class='detailscontainer']//tr[" + td.description + "]/td[2]")[0].text)
}
}
println("SITE \(site) DONE")
}
}
答案 0 :(得分:0)
您尝试查询的内容可能会动态加载(通过JavaScript),因此在HTML最初呈现时无法使用。 Chrome扩展程序的工作原因可能是因为Chrome正在执行构建DOM所需的JavaScript。但是,当您使用Kanna和NSURLSession时,它们不是用于评估JS的JavaScript引擎。