除了使用正则表达式之外,在Swift中解析HTML

Yel*_*low 4 regex swift

下面是我想在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.dyliblibxml2.dylib

4.构建设置下,在页眉搜索路径中,添加$(SDKROOT)/ usr/include/libxml2 警告:确保它不是用户页眉搜索路径,因为这不一样

5.Build Settings,在Other Linker Flags中,添加-lxml2

请享用!

Rob*_*Rob 6

您可以使用典型的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头.有关详细信息,请参阅每个文档.