【问题标题】:iOS: Html parsing - how to ignore tags like a, li, etc.. within <p>iOS:Html 解析 - 如何在 <p> 中忽略 a、li 等标签
【发布时间】:2012-09-07 15:25:00
【问题描述】:

我目前正在使用 Hpple 来解析 HTML,如下所示:

TFHpple *htmlParser = [TFHpple hppleWithHTMLData:[currentString dataUsingEncoding:NSUTF8StringEncoding]];
NSString *paragraphsXpathQuery = @"//p//text()";
        NSArray *paragraphNodes = [htmlParser searchWithXPathQuery:paragraphsXpathQuery];
        if ([paragraphNodes count] > 0) {
            NSMutableArray *tempArray = [NSMutableArray array];
            for (TFHppleElement *element in paragraphNodes) {
                [tempArray addObject:[element content]];
            }
            article.paragraphs = tempArray;
        }

这样我得到一个段落数组,我可以使用NSString *result = [myArray componentsJoinedByString:@"\n\n"]; 将它编译成带有换行符的单个文本体。

但是,如果 html 包含标签,它们会被解释为单独的实体,并且会自行换行,因此在一天结束时从这样的一行:

<p>I went to the <a href="blablabla.html">shop</a> to get some milk!</a></p>
<p>It was awesome.</p>

我明白了:

I went to the

shop

to get some milk!

It was awesome!

当然我想得到这个(忽略p标签内的其他标签):

I went to the shop to get some milk!

It was awesome!

你能帮帮我吗?

【问题讨论】:

    标签: objective-c ios xpath html-parsing hpple


    【解决方案1】:
    NSString *HTMLTags = @"<[^>]*>"; //regex to remove any html tag
    
    NSString *htmlString = @"<html>bla bla</html>";
    NSString *stringWithoutHTML = [hstmString stringByReplacingOccurrencesOfRegex:myregex withString:@""];
    

    不要忘记在你的代码中包含这个:#import "RegexKitLite.h" 这里是下载这个 API 的链接:http://regexkit.sourceforge.net/#Downloads

    【讨论】:

    • 非常感谢!这对我有用!不过,您可能希望在最后一行将“myRegex”更正为 HTMLTags。 :) 其他人注意:导入 RegexKitLite 后,您必须链接到“-licucore”,这可以通过在构建设置的其他链接器标志行中键入 -licucore 来完成!
    • 如果您的项目是为 iOS 4.0 或更新版本构建的(很可能),那么您不需要用于正则表达式的外部库,应该使用 NSRegularExpression:developer.apple.com/library/ios/#documentation/Foundation/…
    【解决方案2】:

    在 XPath 1.0 中,您可以分两步完成此操作

    1. 选择所有p元素://p

    2. 在每个选定的p 元素(用作初始上下文节点)上评估:string()

    解释

    根据定义,将标准 XPath 函数 string() 应用于元素的结果是其所有文本节点后代的串联(按文档顺序)。

    【讨论】:

    • 嗨,我也有兴趣这样做,但我不明白您所说的 evaluate this: string() 是什么意思?你能给出一些非常基本的示例代码吗?
    • @rdurand,如何评估 XPath 表达式取决于实现——阅读您的文档。我可以告诉你如何使用 C# 在 .NET 中执行此操作:使用 XPathNavigator.Evaluate() 方法:msdn.microsoft.com/en-us/library/2c16b7x8.aspx
    • 这就是我发表评论后意识到的。由于这个问题似乎是针对 iOS 的,所以我正在考虑一个 iOS 示例。我会调查一下,似乎@AppleDelegate 提供了另一个 iOS 特定的解决方案。谢谢!
    • @rdurand,只要有可用的 XPath 2.0 实现,就可以通过评估单个 XPath (2.0) 表达式来获得所需的字符串。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-13
    相关资源
    最近更新 更多