使用NSXMLParser解析HTML

3

我正在开发一个应用程序,它从互联网聚合一些信息,并重新格式化内容。因此,我正在寻找一种解析HTML的方法。考虑到XML和HTML在结构上非常相似,我想“也许我应该只使用NSXMLParser”,我已经在使用它来解析我的RSS订阅,并且已经习惯了使用它,但我遇到了一个问题。

解析器无法识别<p>作为元素。它可以轻松提取像<title><img>这样的元素,但不喜欢<p>。是否有人尝试过这样做,并且如果有的话,您对此问题有任何建议或解决方法吗?我认为XMLParser适用于我正在做的事情,并且我想使用它,但是,如果我无法获得<p>元素中的文本,那么它对我来说完全没有用。

欢迎任何建议,即使是建议完全不同的方法。我已经研究了一些第三方库来完成此操作,但据我所读,它们都存在一些错误,并且我更愿意使用Apple提供的东西。

3个回答

4

"p"元素的名字并没有任何特殊之处。虽然你没有提供你正在解析的HTML的示例,所以很难确定问题的原因,但最可能是由于HTML不是格式良好的XML引起的。换句话说,使用NSXMLParser可以处理XHTML,但不一定适用于普通的HTML。

"p"元素在HTML中经常出现,但缺少匹配的关闭标签,这是无效的XML。我的猜测是,你需要将HTML转换为XHTML,然后再尝试使用NSXMLParser来解析它。


任何未关闭的标签是否会导致NSXMLParser失败,还是只会在未关闭的标签上失败?我没有检查过所有的HTML,但我认为所有的“p”标签都是关闭的。这里有一个链接:view-source:http://www.americansongwriter.com/2011/05/behind-the-song-the-gambler/ - evanmcdonnal
任何未关闭的标签都会导致任何XML解析器以某种方式失败,包括NSXMLParser。你所拥有的显然不是有效的XML。我下载了源代码并进行了XML验证,得到了大量错误。例如,在第300和301行上有未关闭的“div”和“input”标签。它还在XML属性中有无效的尖括号字符(例如,在第357行)。错误列表相当长:这个HTML不是有效的XML,因此NSXMLParser不能直接处理它。它需要先进行清理。 - Tim Dean
好的。我不想再延长这个问题了,但您是否仍然建议将其转换为XHTML,还是认为最好采用其他解析方法?此外,如果您认为转换为XHTML最好,能否指点我一些如何操作的参考资料。 - evanmcdonnal
我没有尝试过,所以无法保证任何特定的转换工具,但您可以尝试使用http://www.chilkatsoft.com/html-objc.asp或者使用TouchXML及其Tidy HTML功能(请参见http://stackoverflow.com/questions/4258333/iphone-html-parsing-using-touchxml-and-tidy)。 - Tim Dean

1
我建议您使用我的DTHTMLParser,它是基于NSXMLParser模型,并使用libxml2完美解析HTML。通常情况下,您不能依赖HTML格式良好且可解析为xml。 libxml2具有HTML模式,可以忽略未关闭的标签和任何HTML可能存在的特殊性。
HTML解析解释:

DTHTMLParser 文档:

源代码,DTFoundation 的一部分:


1

HTML并不一定是格式良好的XML,这就是当您将其解析为XML时遇到的问题。

以以下示例为例:

<body>
    <p>123
    <p>abc
    <p>789
</body>

如果您在浏览器中查看此 HTML 代码块,它将显示您所期望的内容。但是,如果您将其解析为 XML,则会出现问题,因为这些 p 标签没有关闭。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接