c#
  • xpath
  • html-parsing
  • html-agility-pack
  • xpath-2.0
  • 2013-12-13 42 views 0 likes 
    0

    我似乎無法得到此xpath查詢與此代碼一起使用HTMLAgilityPack,我想知道是否有人有任何建議。帶有HTML敏捷包的子字符串的最大值

    這是我到目前爲止的查詢,但我似乎無法讓它返回一個數字。

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

    我試圖用類shackmsg的所有hrefs=符號後得到的href屬性MAX值。

    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

    您正在觀察的錯誤/意外行爲是什麼? – jessehouwing

    +0

    它返回「」值,因爲它沒有找到匹配。 – stonedonkey

    +0

    'GetAttributeValue'嘗試獲取所選節點的sinhe屬性的值。你嘗試過'SelectSingleNode'然後獲取值嗎? – jessehouwing

    回答

    0

    據我可以看到有兩個問題:

    • 你是在目前情況下爲錨標籤只掃描。你可能想擴展掃描無處不在(使用//在查詢的開始):

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

      注意,我刪除了一對括號不必要的。

    • 如果我沒有完全弄錯,HTML敏捷包只支持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外部查找最大值。

    0

    你可以用HTML敏捷性包結合XPath和使下面的代碼:

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

    而這種輸出:

    31219008 
    

    在這段代碼我假設總是存在href屬性並且始終具有以下結構:

    "?id=XXXX" 
    
    相關問題