【问题标题】:hpple xpath problemshpple xpath 问题
【发布时间】:2013-04-08 13:11:46
【问题描述】:

我正在使用 hpple 来解析 HTML 文档。我遵循了 Ray Wenderlich 的教程,并让他们的示例文件一切正常。但是,我需要对其进行一些更改,以便为我的朋友博客读取某个 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 附带的示例,但我无法将它们拼凑在一起。

更新:在 Jens 的帮助下,我已将查询更改为
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

通过在我重新加载数据时放入 if 语句来修复错误索引超出范围。我在我的 NSLog 中得到一个数组,但它没有把它放在我的表格视图中。表格视图出现空!!但不会再崩溃了!!!

最终更新

它现在可以工作了,Jens 帮我把查询弄对了,然后我只需要填写表格视图。我将数组计数设置为 20,因为 Ray 的 tut 有无数个条目。我朋友的博客,只有四个!感谢大家的帮助。

【问题讨论】:

  • 您是否真的在使用您在示例中发布的引用(较小的 HTML sn-ps 和您的查询)?如果是这样,请用正确的替换它们。否则,您的查询看起来不错。
  • @JensErat,您还指的是哪些报价?查询中的单引号? ‘entry-title’ 如果是,它们应该是什么?双胞胎?
  • 两者 - 您没有使用标准 ASCII 引号('"),而是使用印刷引号(//)。众所周知,Wordpress 会替换这些引号(使用某些插件?),如果您从某些教程中复制了该代码,则 wordpress 可能会弄乱您的引号。
  • @JensErat,我明白你的意思。实际上,我在 Pages 中写下了我的问题以使其恰到好处,然后在 SO 上复制并粘贴到此处。页面必须更改了引号,因为在 Xcode 中它们是 ASCII 引号!感谢您指出这一点。
  • 你应该在你的帖子中更正它们,然后;其他也会被误导。这不是您的完整 XML。您的输入是否可能包含名称空间?如果可能的话,也许把它发布到gist 或其他地方。

标签: ios xpath hpple


【解决方案1】:

问题:

您的文档包含命名空间:

<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']

【讨论】:

  • 詹斯,我尝试了这两种方法,但都没有奏效。 xmlXpathReg... 行不再可用,当我将 *: 放在 h2 前面时,它说无法解析。非常感谢您花时间为我研究这个问题,我会继续努力的。
  • 尝试手动删除命名空间(保存文档并删除 xmlns 属性)。问题是否仍然存在?
  • Jens,我保存了文档并删除了 xmlns 属性,但现在它不会让我解析任何内容。我不是通过 url 获取数据,而是通过添加到 Xcode 的文件获取数据。
  • 詹斯,非常感谢您的帮助。你的建议让我朝着正确的方向前进!!我让它工作了。查询是正确的,我只是错误地设置了 tableview。但如果没有你的帮助,我不会得到正确的查询,所以谢谢!!
猜你喜欢
  • 2015-12-03
  • 2012-12-04
  • 1970-01-01
  • 2012-06-30
  • 1970-01-01
  • 1970-01-01
  • 2013-08-26
  • 1970-01-01
  • 2011-06-21
相关资源
最近更新 更多