<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ī和yǎn
正则表达式:
/pinyin.+<span.+>(.+)<\/.+<span.+>(.+)<\//Us
我想知道如何实现它,以便我可以同时捕获yī和yǎn并将其保存到数组中.此外,我想知道如果没有正则表达式,我是否还有其他方法可以做到这一点.
编辑:
我最终按照Rob的建议使用了TFHpple.虽然我确实花了很长时间才弄清楚如何将它导入Swift,所以我认为为方便起见将它发布在这里会很有帮助:
1.打开项目并将TFHpple文件拖入其中
2.此时,如果您当前项目中未包含任何Obj-C代码,XCode可能会提示您创建桥接头类文件.在这个桥接头文件中,您应该添加:
#import <Foundation/Foundation.h> #import "TFHpple.h" #import "TFHppleElement.h"
3.在“常规”下的“链接的框架和库”中选择目标(只需在“常规”选项卡中向下滚动,您将看到它,添加libxml2.2.dylib和libxml2.dylib
4.在“构建设置”下的“标题搜索路径”中,添加$(SDKROOT)/usr/include / libxml2
警告:请确保它不是用户标题搜索路径,因为这不相同
5.在Build Settings,在Other Linker Flags中,添加-lxml2
请享用!
解决方法
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头.有关详细信息,请参阅每个文档.