我似乎无法通过此代码使用此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>
有什么建议吗?
答案 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支持会显示为两个问题:
功能substring-after(...)
不存在。
问题的解决方案可能是使用string-lenght($string)
和substring($string, $start, $length)
来提取最后n位数字,或translate(...)
删除一些字符:
translate('?id=31219008', '?id=', '')
将删除字符类[?id=]
中的所有出现(但它没有,我只是想突出显示它与字符串不匹配,而是该集的各个字符!)。
您无法在轴步骤中应用函数。这意味着,您无法找到子串的最大值。
可能的解决方案:只获取所有子字符串并从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"