加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-14 05:56:07 所属栏目:百科 来源:网络整理
导读:下面是我想在 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解析的好
下面是我想在 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ī和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

请享用!

解决方法

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读