之前一直以为需要正则一点点解析出来,后来在Git上看到了Ono这个库,感觉非常不错,用起来也非常简单,不过遗憾的是它已经两年没有更新了(好像也确实没啥必要更新...)。
第一步、第一步需要做的当然是获取到网页的HTML,这个可以使用一般的网络请求即可。当然有的网站数据是异步的,如果使用普通的HTTP请求并不能获取到源码,而只能获取到一堆的JS,哪对我们的工作并没有任何帮助,我们需要使用一个WebView加载链接,当加载完成之后也就可以获取到HTML了。
具体操作如下,
如果是使用UIWebView加载的话,只需要在其结束的代理方法中即可获取HTML数据了。
第二步、我们知道在网页中可以使用documenet对HTML元素进行访问。Ono中的ONOXMLDocument即模仿了HTML的DOM操作,首先我们将获取到的网页源码转换成ONOXMLDocument对象
ONOXMLDocument *doc = [ONOXMLDocument HTMLDocumentWithString:html encoding:NSUTF8StringEncoding error:&error];
之后就可以根据节点在HTML文档中的XPath获取到该节点了。我这里获取XPath是使用的Firebug,当然根据浏览器的不同有各种各样的获取方法,这个自行百度。同时也支持使用CSS来获取节点。
ONOXMLElement *PlayerParentElement = [doc firstChildWithXPath:@"/html/body/div[5]/div[2]/table[1]"];
如果是解析<table>或者<ul>标签的话,可以将其分为两层
ONOXMLElement *PlayerParentElement = [doc firstChildWithXPath:@"/html/body/div[5]/div[2]/table[1]"];
[PlayerParentElement.children enumerateObjectsUsingBlock:^(ONOXMLElement*element,NSUIntegeridx,BOOL*_Nonnullstop) {
*****在这里解析其子节点即可element
}];
需要注意的是,根据XPath并不能很好的支持<tbody>标签,所以在对html进行处理之前,我直接将其移除了。
上面的描述可能零零散散,并不能很好的说明吧。自从小学毕业之后,已经丧失了写作文的能力。下面是关键部分代码。应该很简洁明了咯。
在使用的过程中,发现这其实也存在非常多的缺陷性,我之所以使用它也仅仅是因为其满足自己的一点小需求。这种解析HTML的方式,相比于轻量级的JSON来说是非常消耗内存和性能的。更可怕的是别人的网站随便改改可能就影响App使用,并不适合做升级维护...,但是用来为教务在线这种网站做个app也是蛮有意思的。
我现在还没有找到比较普适的与后台进行数据交互的方法,如果真的有解决方案,哪就完美了。如果你有,请告诉我一下。
@end
网友评论