以下是我想在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>

我读过Regex不是通过HTML解析的好方法,但是尽管如此,我还是写了一个表达式来捕获想要的内容(即跨度之间的字母):yǎn
正则表达式:
/pinyin.+<span.+>(.+)<\/.+<span.+>(.+)<\//Us

我想知道如何实现它,以便可以同时捕获yǎn并将其保存到数组中。另外,我想知道如果没有Regex,我是否还有其他方法可以做到这一点。

编辑:

我最终按照Rob的建议使用了TFHpple。尽管我花了很长时间弄清楚如何将其导入到Swift中,所以我认为为方便起见将其发布在这里会有所帮助:

1. 打开您的项目并将TFHpple文件拖到其中

2. 此时,如果当前项目中未包含任何Obj-C代码,则XCode可能会提示您创建一个桥接标题类文件。在此桥接头文件中,您应该添加:
#import <Foundation/Foundation.h>
#import "TFHpple.h"
#import "TFHppleElement.h"

3. 。在链接的框架和库中,在 General 下,选择目标(只需在 General 选项卡中向下滚动,您将看到它,添加 libxml2.2.dylib .dylib

4. 的构 build 置下,在 header 搜索路径中,添加 $(SDKROOT)/usr/include/libxml2
警告:请确保它不是用户标题搜索路径,因为这不相同

5. 下Build Settings ,在中,其他链接器标志,添加-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)
    }
}

或者您可以使用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)
    }
}

我在TFHpple上有更多的里程,所以我个人对此比较满意。 NDHpple在理论上似乎可以替代,尽管我个人并不那么疯狂(例如,为什么HTMLData参数采用字符串而不是NSData?为什么我必须在子级中导航以获取//td/a/span结果的内容?[@class='pinyin']限定词似乎不起作用,等等。)但是,请同时尝试两者,看看您喜欢哪个。

两者都需要桥接头:TFHpple在桥接头中需要TFHpple.h,NDHpple在那需要libxml头。有关更多信息,请参见每个文档。

10-05 20:17