最近项目使用到hpple,简单说一下使用方式,做做笔记
let responseData = response as! NSData
let utf8Html = responseData.stringGBK().stringByReplacingOccurrencesOfString("gb2312", withString: "utf-8")
let doc:TFHpple = TFHpple.init(HTMLData: utf8Html.dataUsingEncoding(NSUTF8StringEncoding))
let eles = doc.searchWithXPathQuery("//h3/a")
eles.forEach({ (item:AnyObject!) -> () in
let ele = item as! TFHppleElement
if let text = ele.text(){
if ele.objectForKey("href").rangeOfString("notice.php") == nil { let thread = Thread()
thread.text = text
thread.href = ele.objectForKey("href")
print(thread.href)
}
}
})
1.初始化数据
从server返回来的数据是gb2312编码的文本(很蛋痛),所以必须得将其先转换成UTF编码的格式
stringGBK的内部实现是这样的
extension NSData{ func stringGBK()->String{
let gbkEncoding = CFStringConvertEncodingToNSStringEncoding((UInt32)(CFStringEncodings.GB_18030_2000.rawValue))
let str = String(data: self, encoding: gbkEncoding)
return str!
} }
在代用TFHpple的init之前,得注意header便签的meta charset 属性值,这货只认utf-8
let utf8Html = responseData.stringGBK().stringByReplacingOccurrencesOfString("gb2312", withString: "utf-8")
具体是因为hpple使用的是libxml2这个库
http://www.xmlsoft.org/encoding.html 具体可以这看看官网的介绍
在获取html字符串后,就可以调用hpple的初始化方法
let doc:TFHpple = TFHpple.init(HTMLData: utf8Html.dataUsingEncoding(NSUTF8StringEncoding))
2.查找dom
我们使用类css选择器的方式,下面这句话的意思是css选择器中 h3>a
let eles = doc.searchWithXPathQuery("//h3/a")
3.获取属性
text()获取 element.html 中的内容,text可能返回nil
获取属性 提供一个
ele.objectForKey