最近因爲工作的需要,使用到HTML解析的功能,網上找到了Hpple庫,可以支持HTML的解析,不過Hpple不支持HTML節點的修改,在沒有找到更好的輪子的情況下所以打算自己在這個庫的基礎上進行擴展。這邊主要記錄下YTTHpplePlus的使用方法,不對實現進行解釋,在文章的底部提供了幾篇參考文章,有興趣的可以自行查看。
YTTHpplePlus 是Hpple的擴展,在Hpple的基礎上擴展了節點的增刪改查、文檔導出功能,原始的Hpple庫可以從 Hpple在GitHub上的鏈接 中查看,感謝作者原始的貢獻。
對應功能的使用方法參考單元測試類NewPageTest
中找到,支持的功能如下:
- 更新或者添加屬性
- (void)testSetAttr {
NSArray *imgs = [self.doc searchWithXPathQuery:@"//img"];
for (TFHppleElement* element in imgs) {
NSString* raw = element.raw;
NSString* tagName = element.tagName;
NSString* content = element.content;
NSDictionary* attributes = element.attributes;
NSString* src = [element objectForKey:@"src"];
}
// 設置第一個元素的屬性
if (imgs.count > 0) {
TFHppleElement* element = imgs.firstObject;
[self.doc setOrUpdateAttribute:@{@"width": @"13131"} inElement:element];
}
[self.doc exportXmlDoc];
NSLog(@"=");
}
- 更新節點的內容,比如
<p>
,<a>
,<div>
等標籤中的內容
- (void)testSetContent {
NSArray *paragraphes = [self.doc searchWithXPathQuery:@"//p"];
if (paragraphes.count) {
TFHppleElement* element = paragraphes.firstObject;
[self.doc setOrUpdateContent:@"這個是更新替換後的內容" inElement:element];
}
[self.doc exportXmlDoc];
}
- 刪除節點,子接點也會對應的從文檔中刪除
- (void)testRemoveNode {
NSArray *paragraphes = [self.doc searchWithXPathQuery:@"//p"];
if (paragraphes.count) {
TFHppleElement* element = paragraphes.firstObject;
[self.doc deleteElement:element];
}
[self.doc exportXmlDoc];
}
- 導出文檔,導出增刪改查之後的文檔
// 增刪改查操作
[self.doc exportXmlDoc];
TODOS
- 文檔導出會導致有部分雙標籤變成了單標籤,比如
<script>
標籤,這導致了web瀏覽器加載HTML文檔出問題,目前項目中我使用了兩種方法解決這個問題,希望有人如果有更好的方案,可以分享一下。
- 正則替換
script
標籤
NSRegularExpression *regularExpression = [NSRegularExpression regularExpressionWithPattern:@"<script.*</script>" options:0 error:nil];
content = [regularExpression stringByReplacingMatchesInString:content options:0 range:NSMakeRange(0, content.length) withTemplate:@""];
- 在
script
標籤中添加一些額外的內容,然後最終生成文檔的時候再進行替換
<script src="../js/news-script.js">var abcd;</script>
htmlString = [htmlString stringByReplacingOccurrencesOfString:@"<![CDATA[var abcd;]]>" withString:@""];