【问题标题】:Hpple in Objective-C can't find a particular object (XML/HTML Parser)Objective-C 中的 Hpple 找不到特定对象(XML/HTML 解析器)
【发布时间】:2011-05-21 13:36:06
【问题描述】:

对于那些没有尝试过 Hpple 的老手来说,这很棒。它使用 Xpath 搜索 HTML/XML 文档。它完成了工作,对于像我这样的新手来说很容易理解。但是,我遇到了麻烦。

我有这段 HTML:

    <ul class="challengesList dailyChallengesList">

<li>
<div class="corner topLeft"></div>
<img id="ctl00_mainContent_dailyChallengesRepeater_ctl00_challengeImage" title="Gunslinger" src="/images/reachstats/challenges/0.png" alt="Gunslinger" style="border-width:0px;">
<div class="info">
<div class="rFloat">
<p id="ctl00_mainContent_dailyChallengesRepeater_ctl00_challengeExpiration" class="timeDisplay dailyExpirationCountdown"><span>0d</span><span>19h</span><span>9m</span><span class="seconds">37s</span></p>
<p>1500cR</p>
</div>
<h5>Gunslinger</h5>
<p class="description">Kill 150 enemies in multiplayer Matchmaking.</p>
<div class="reward">

<div id="ctl00_mainContent_dailyChallengesRepeater_ctl00_progressBox" class="barContainer">
<div id="ctl00_mainContent_dailyChallengesRepeater_ctl00_progressBar" class="bar" style="width:21%;"><span></span></div> 
<p>31/150</p>
</div>
</div>
</div>
<div class="clear"></div>
</li>

<li>
<div class="corner topLeft"></div>
<img id="ctl00_mainContent_dailyChallengesRepeater_ctl01_challengeImage" title="A Great Friend" src="/images/reachstats/challenges/0.png" alt="A Great Friend" style="border-width:0px;">
<div class="info">
<div class="rFloat">
<p id="ctl00_mainContent_dailyChallengesRepeater_ctl01_challengeExpiration" class="timeDisplay dailyExpirationCountdown"><span>0d</span><span>19h</span><span>9m</span><span class="seconds">37s</span></p>
<p>1400cR</p>
</div>
<h5>A Great Friend</h5>
<p class="description">Earn 15 assists today in multiplayer Matchmaking.</p>
<div class="reward">

<div id="ctl00_mainContent_dailyChallengesRepeater_ctl01_progressBox" class="barContainer">
<div id="ctl00_mainContent_dailyChallengesRepeater_ctl01_progressBar" class="bar" style="width:40%;"><span></span></div> 
<p>6/15</p>
</div>
</div>
</div>
<div class="clear"></div>
</li>

<li>
<div class="corner topLeft"></div>
<img id="ctl00_mainContent_dailyChallengesRepeater_ctl02_challengeImage" title="Cannon Fodder" src="/images/reachstats/challenges/2.png" alt="Cannon Fodder" style="border-width:0px;">
<div class="info">
<div class="rFloat">
<p id="ctl00_mainContent_dailyChallengesRepeater_ctl02_challengeExpiration" class="timeDisplay dailyExpirationCountdown"><span>0d</span><span>19h</span><span>9m</span><span class="seconds">37s</span></p>
<p>1000cR</p>
</div>
<h5>Cannon Fodder</h5>
<p class="description">Kill 50 infantry-class foes in the Campaign today.</p>
<div class="reward">

<div id="ctl00_mainContent_dailyChallengesRepeater_ctl02_progressBox" class="barContainer">
<div id="ctl00_mainContent_dailyChallengesRepeater_ctl02_progressBar" class="bar" style="width:0%;"><span></span></div> 
<p>0/50</p>
</div>
</div>
</div>
<div class="clear"></div>
</li>

<li>
<div class="corner topLeft"></div>
<img id="ctl00_mainContent_dailyChallengesRepeater_ctl03_challengeImage" title="Heroic Demon" src="/images/reachstats/challenges/3.png" alt="Heroic Demon" style="border-width:0px;">
<div class="info">
<div class="rFloat">
<p id="ctl00_mainContent_dailyChallengesRepeater_ctl03_challengeExpiration" class="timeDisplay dailyExpirationCountdown"><span>0d</span><span>19h</span><span>9m</span><span class="seconds">37s</span></p>
<p>1500cR</p>
</div>
<h5>Heroic Demon</h5>
<p class="description">Kill 30 Elites in Firefight Matchmaking on Heroic or harder.</p>
<div class="reward">

<div id="ctl00_mainContent_dailyChallengesRepeater_ctl03_progressBox" class="barContainer">
<div id="ctl00_mainContent_dailyChallengesRepeater_ctl03_progressBar" class="bar" style="width:0%;"><span></span></div> 
<p>0/30</p>
</div>
</div>
</div>
<div class="clear"></div>
</li>

</ul>

最重要的是,我无法让 Hpple “看到”&lt;div class="reward"&gt;。我正在使用以下方法找到它:

NSArray * rawProgress = [doc search:@"//ul[@class='challengesList']
                                          /li/div[@class='info']
                                                 /div[@class='reward']/p"];

这总是返回一个空数组。这让我发疯了,因为同样的事情适用于这个项目中的所有其他元素......

任何帮助将不胜感激:)

编辑

这行得通:

NSArray * rawDescriptions = [doc search:@"//ul[@class='challengesList']
                                              /li/div[@class='info']
                                                     /p[@class='description']"];

这不是:

NSArray * rawProgress = [doc search:@"//ul[@class='challengesList']
                                          /li/div[@class='info']
                                                 /div[@class='reward']
                                                     /div[@id]//p"];

此外,尝试列出 rFloat 或奖励的子节点会导致崩溃:(

【问题讨论】:

  • 不要忘记在问题文本中的 &lt;div ...&gt; 元素周围加上反引号...已为您修复。
  • 您的编辑未修复它。在 'cannot get Hpple to "see" the' 之后,我会留给你在需要的地方加上反引号。
  • 你能发布更多你输入的 HTML 吗?并三重检查您发布的内容是否真的是作为输入的内容?
  • 我输入了输入 HTML 的 4/5。您可以在以下位置查看完整源代码:view-source:bungie.net/Stats/Reach/Challenges.aspx?player=Aurum+Aquila

标签: html objective-c xpath screen-scraping hpple


【解决方案1】:

您的“p”元素不是 div class="reward" 的直接子元素。

使用您提供的 XML,XPath 表达式

div[@class='info']/div[@class='reward']//p

会起作用的。

【讨论】:

  • 感谢您的推荐,但这会返回一个空值。我添加了一个有效的表达式示例。
  • @Aurum - @Flack 是正确的,你的第一个 XPath,如给定的那样,不应该返回任何东西,因为div[@class='reword'] 没有直接的 p 子元素。
  • 但问题是,当我要求它列出奖励的孩子时,它似乎什么都没有。当我要求它列出信息时,奖励没有出现。
【解决方案2】:
  • 请参阅this SO question,了解有关 Hpple 问题的类似报告以及替代方案列表。

您可能会看到一个错误。根据this page

它被归类为实验 开发商的项目,但到目前为止 它“为我工作”

更新:现在似乎有点坏了。 谁有更好的解决方案?

您可能想enter a bug report,如果项目仍在维护中,也许开发人员会回复修复或解决方案。或者您可以在 this page that recommended hpple 上发表评论,看看该博主或他的一位读者是否可以解决问题或告诉您 hpple 是否处于活动状态。

您还可以查看是否可以找到HyperParser。 “这是一个简单的 HTML 解析器,其 API 类似于 NSXMLParser。专为解析半有效的 HTML 而设计。”但它似乎不存在于以前的链接中。

【讨论】:

  • 是的,这是 libxml 的问题。我尝试直接使用它,结果相同。我认为该网站的 HTML 格式不正确......所以,我正在考虑使用 HTML 整洁或从其他人那里用更好的 HTML 抓取统计信息。
  • 这和img标签没有关闭有关系吗?
  • @Aurum:似乎不太可能,因为当 div 之前有一个 &lt;img&gt; 时,您的带有 li/div[@class='info'] 的 XPath 表达式之一正在工作。但是根据您对 libxml 的了解,为什么要依靠折断的芦苇呢? HTMLTidy 听起来是个不错的解决方案。
  • 据该网站称,HyperParser 现在是 BaseAppKit 的一部分,位于:baseappkit.com
猜你喜欢
  • 2015-02-12
  • 2015-09-27
  • 2011-07-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-17
  • 2013-04-15
  • 1970-01-01
  • 2012-08-24
相关资源
最近更新 更多