我正在使用hpple解析HTML文档。我按照Ray Wenderlich的教程进行操作,并使其示例文件正常运行。但是,我需要对其进行一些更改以读取我的 friend 博客的特定HTML文件。该文件比我到目前为止使用的示例更复杂。文件的相关部分(完整上传到gist上是:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US" xml:lang="en-US">
<!-- snip -->
<div id="content" class="hfeed">
<div class="post-21443 post type-post status-publish format-standard hentry category-about-catherine">
<div class="postdate">
Apr <br />
6 <br />
2013
</div>
<h2 class="entry-title"><a href="http://catherinepooler.com/2013/04/stampnation-live-retreat-updates/" title="StampNation LIVE Retreat Updates" rel="bookmark">StampNation LIVE Retreat Updates</a></h2>
<div class="post-info"></div> <div class="entry-content">
<p><a href="http://catherinepooler.com/wp-content/uploads/2013/04/IMG_0560.jpg" ><img class="aligncenter size-large wp-image-21444" alt="StampNation LIVE" src="http://catherinepooler.com/wp-content/uploads/2013/04/IMG_0560-450x337.jpg" width="450" height="337" /></a></p> <p>StampNation LIVE is in full swing! We are having a wonderful time. I am taking a quick break from stamping and chatting to share a few photos with you.</p> <p>I think my favorite thing in getting ready for the retreat was setting up the Accessory Bar. Each attendee received a small galvanized bucket with their fully glittered initial on it to fill up at the bar. Awesome!</p>
<!-- snip -->
文件中有几个这样的部分,我需要将所有
<h2 class = "entry-title">
(title =“StampNation LIVE Retreat Updates”)。我已经成功放置了
<div class = "entry-content">
通过使用XPathQuery
//div[@class = 'entry-content']/p
放入数组。但是,似乎没有标题就不会因为空数组而使代码崩溃。显然我的XPathQuery是不正确的。这就是我尝试过的。//h2[@class = 'entry-title'] (: this crashed :)
//div[@class = 'post-21443.....']//h2[@class = 'entry-title'] (: this crashed too. ")
伴随着其他尝试!
有人对我有什么建议吗?我调查了许多SO答案以及hpple附带的示例,但我无法将它们拼凑起来。
更新:在詹斯的帮助下,我已将查询更改为
NSString * postsXpathQueryString = @“// h2 [@class ='entry-title'] / a”;
这使我得到一个数组,但现在我也收到此错误。
2013-04-08 10:26:30.604 HTML [12408:11303] *由于未捕获的异常'NSRangeException'而终止应用程序,原因:'* -[__ NSArrayM objectAtIndex:]:索引4超出范围[0 .. 3] '
*首先抛出调用堆栈:
(0x210a012 0x1203e7e 0x20ac0b4 0x3852 0x2028fb 0x2029cf 0x1eb1bb 0x1fbb4b 0x1982dd 0x12176b0 0x2706fc0 0x26fb33c 0x2706eaf 0x2372bd 0x17fb56 0x17e66f 0x17e589 0x17d7e4 0x17d61e 0x17e3d9 0x1812d2 0x22b99c 0x178574 0x17876f 0x178905 0x9733ab6 0x181917 0x14596c 0x14694b 0x157cb5 0x158beb 0x14a698 0x2065df9 0x2065ad0 0x207fbf5 0x207f962 0x20b0bb6 0x20aff44 0x20afe1b 0x14617a 0x147ffc 0x1d2d 0x1c55)
libc ++ abi.dylib:终止调用引发异常
更新2
通过在reloadData时放入if语句来修复错误索引超出范围的问题。我在NSLog中得到了一个数组,但是没有将其放在表视图中。表格视图显示为空!但没有更多的崩溃!
最后更新
现在可以正常工作了,Jens帮助我使查询正确无误,然后我只需要填写表格视图即可。我将数组数设置为20,因为Ray的tut有不计其数的条目。我的 friend 博客只有四个!感谢您的所有帮助。
最佳答案
问题:
您的文档包含名称空间:
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US" xml:lang="en-US">
解:
我不熟悉hpple或ObjectiveC,因此无法验证从this hpple github issue调整的代码,但看起来很合理。我想您要做的就是将第一个参数更改为xpath上下文变量。
xmlXPathRegisterNs(xpathCtx, [@"xhtml" cString],[@"http://www.w3.org/1999/xhtml" cString]);
然后,每次访问元素时,都为此名称空间添加前缀:
//xhtml:h2[@class = 'entry-title']
如果您不想使用名称空间(并且由于具有不同而无需使用),则可以添加通配符名称空间:
//*:h2[@class = 'entry-title']
关于ios - hpple xpath问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15879979/