下面是我想在Swift中解析的HTML代码:
<td class="pinyin">
<a href="rsc/audio/voice_pinyin_pz/yi1.mp3">
<span class="mpt1">y?</span></a>
<a href="rsc/audio/voice_pinyin_pz/yan3.mp3">
<span class="mpt3">y?n</span>
</a>
</td>
Run Code Online (Sandbox Code Playgroud)
我已经读过Regex不是通过HTML解析的好方法,但是我写了一个表达式来捕获我想要的东西(这是跨度之间的字母):y?和y?n
正则表达式:
/pinyin.+<span.+>(.+)<\/.+<span.+>(.+)<\//Us
Run Code Online (Sandbox Code Playgroud)
我想知道如何实现它,以便我可以同时捕获它们y?并将y?n其保存到数组中.此外,我想知道如果没有正则表达式,我是否还有其他方法可以做到这一点.
编辑:
我最终按照Rob的建议使用了TFHpple.虽然我确实花了很长时间才弄清楚如何将它导入Swift,所以我认为为方便起见将其发布在此处会很有帮助:
1.打开项目并将TFHpple文件拖入其中
2.此时,如果您当前项目中未包含任何Obj-C代码,XCode可能会提示您创建桥接头类文件.在这个桥接头文件中,您应该添加:
#import <Foundation/Foundation.h>
#import "TFHpple.h"
#import "TFHppleElement.h"
Run Code Online (Sandbox Code Playgroud)
3.选择目标,下一般,在链接的框架和库(只需向下滚动,当你在常规选项卡,你会看到它,添加libxml2.2.dylib和libxml2.dylib
4.在构建设置下,在页眉搜索路径中,添加$(SDKROOT)/ usr/include/libxml2 警告:确保它不是用户页眉搜索路径,因为这不一样
5.在Build Settings,在Other Linker Flags中,添加-lxml2
请享用!
您可以使用典型的iOS HTML解析器TFHpple:
let data = NSData(contentsOfFile: path)
let doc = TFHpple(HTMLData: data)
if let elements = doc.searchWithXPathQuery("//td[@class='pinyin']/a/span") as? [TFHppleElement] {
for element in elements {
println(element.content)
}
}
Run Code Online (Sandbox Code Playgroud)
或者您可以使用NDHpple:
let data = NSData(contentsOfFile: path)!
let html = NSString(data: data, encoding: NSUTF8StringEncoding)!
let doc = NDHpple(HTMLData: html)
if let elements = doc.searchWithXPathQuery("//td/a/span") {
for element in elements {
println(element.children?.first?.content)
}
}
Run Code Online (Sandbox Code Playgroud)
我有更多的TFHpple里程,所以我个人对此更加满意.NDHpple似乎在理论上可能是另一种选择,虽然我并没有像个人那样疯狂(例如为什么HTMLData参数需要字符串而不是NSData?为什么我必须通过子项导航以获取//td/a/span结果的内容?[@class='pinyin']限定符不会出现工作等).但是,试试两个,看看你喜欢哪个.
两者都需要桥接头:TFHpple需要TFHpple.h在桥接头中,NDHpple需要libxml头.有关详细信息,请参阅每个文档.