使用带有HTML Agility Pack的子字符串的最大值

时间:2013-12-13 16:55:05

标签: c# xpath html-parsing html-agility-pack xpath-2.0

我似乎无法通过此代码使用此HTML路径查询来处理HTMLAgilityPack,我想知道是否有人有任何建议。

这是我到目前为止的查询,但我似乎无法让它返回一个数字。

DocumentNode.GetAttributeValue("max(a[(@class='shackmsg')]/@href/substring-after(.,?id='))", "");

我试图在所有MAX上使用 shackmsg类的href符号后,在=属性中获取hrefs

How long is the beta live before it goes retail? No one knows. We do know t</span> : </a><span class="oneline_user ">legsbrogan</span>
</div>
</li>
<li id="item_31218936" class="">
<div class="oneline oneline3 op olmod_ontopic olauthor_189801">
<a class="shackmsg" rel="nofollow" href="?id=31218936" onclick="return clickItem( 31218933, 31218936);"><span class="oneline_body"><b><u><span class="jt_yellow">Current Multiplayer Servers</span>!</u></b>
<span class="jt_sample"><span class="jt_green">Nighteyes's Japan Server: </span> <span class="jt_lime">(PvE)</span>: <b>211.15.2.34</b></span>
<span class="jt_sample"><span class="jt_green">zolointo's Canada Server: </span> <span class="jt_lime">(</span></span></span> : </a><span class="oneline_user ">legsbrogan</span>
</div>
</li>
<li id="item_31218938" class="last">
<div class="oneline oneline2 op olmod_ontopic olauthor_189801">
<div class="treecollapse">
  <a class="open" rel="nofollow" href="#" onclick="toggle_collapse(31218938); return false;" title="Toggle">toggle</a>
</div>
<a class="shackmsg" rel="nofollow" href="?id=31218938" onclick="return clickItem( 31218933, 31218938);"><span class="oneline_body">Had fun freezing my ass off last night with a bunch of shackers.  Not sure who started the big tower we f...</span> : </a><span class="oneline_user ">legsbrogan</span>
</div>
<ul>
<li id="item_31218966" class="">
<div class="oneline oneline1 olmod_ontopic olauthor_128401">
<a class="shackmsg" rel="nofollow" href="?id=31218966" onclick="return clickItem( 31218933, 31218966);"><span class="oneline_body">wasn't me. I hung out on my ship for a bit listening to your kid play Christmas songs for a bit and then ...</span> : </a><span class="oneline_user ">jonin</span><a class="lightningbolt" rel=\"nofollow\" href="http://www.shacknews.com/user/jonin/posts?result_sort=postdate_asc"><img src="http://cf.shacknews.com/images/bolt.gif" alt="This person is cool!" /></a>
</div>
</li>
<li id="item_31219008" class="last">
<div class="oneline oneline0 olmod_ontopic olauthor_8618">
<a class="shackmsg" rel="nofollow" href="?id=31219008" onclick="return clickItem( 31218933, 31219008);"><span class="oneline_body">haha i heard you guys booby trapped some poor sap's space ship</span> : </a><span class="oneline_user ">Break</span><a class="lightningbolt" rel=\"nofollow\" href="http://www.shacknews.com/user/Break/posts?result_sort=postdate_asc"><img src="http://cf.shacknews.com/images/bolt.gif" alt="This person is cool!" /></a>
</div>
</li>
</ul>

有什么建议吗?

2 个答案:

答案 0 :(得分:0)

据我所知,有两个问题:

  • 您只是在当前上下文中扫描锚标记。您可能希望扩展到任何地方进行扫描(在查询开头使用//):

    //a[@class='shackmsg']/@href/substring-after(., '?id=')
    

    请注意,我删除了一对不必要的括号。

  • 如果我没有完全弄错,HTML Agility Pack仅支持XPath 1.0(但我并不完全确定)。虽然System.Xml.XPath表示它实现了XPath 2.0数据模型,但它实际上并没有实现XPath 2.0(可能这样做是因为第三方API可以实现此API并同时提供XPath 2.0 / XQuery支持)。另请查看this discussion on .NET's XPath 2.0 support

缺少XPath 2.0支持会显示为两个问题:

  1. 功能substring-after(...)不存在。

    问题的解决方案可能是使用string-lenght($string)substring($string, $start, $length)来提取最后n位数字,或translate(...)删除一些字符:

    translate('?id=31219008', '?id=', '')
    

    将删除字符类[?id=]中的所有出现(但它没有,我只是想突出显示它与字符串不匹配,而是该集的各个字符!)。

  2. 您无法在轴步骤中应用函数。这意味着,您无法找到子串的最大值。

    可能的解决方案:只获取所有子字符串并从XPath外部找到最大值。

答案 1 :(得分:0)

您可以将XPath与HTML Agility Pack结合使用,并生成以下代码:

var value = doc.DocumentNode.SelectNodes("//a[@class='shackmsg']").Select(
                   x => x.Attributes["href"].Value.Substring(4)).Max();

Console.WriteLine(value);

这个输出:

31219008

在此代码中,我假设始终存在href属性,并始终具有以下结构:

"?id=XXXX"