【问题标题】:Html Agility Pack xPath issueHtml Agility Pack xPath 问题
【发布时间】:2013-02-13 14:21:55
【问题描述】:

我正在开发一个 .Net 控制台应用程序。
我想请求一个 HTML 页面,然后在其中获取一些数据。
我使用Html Agility Pack 从响应 HTML 页面构建对象模型并使用 xPath 选择节点。

这是响应 HTML 页面的摘录:

<!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">
<!-- ... -->
<body>
    <div class="conteneur">
        <!-- ... -->
        <div class="page">
            <div class="inter_page">
                <!-- ... -->
                <form action="missions.html" method="post" id="formliste">
                <table class="tbl_deco_mini" cellspacing="0" style="width: 30%; margin: 0px;">
                    <tr>
                        <!-- ... -->
                    </tr>
                    <tr>
                        <td colspan="2" class="td">
                            <div class="inliste">
                                <p class="ligne_epee">
                                    <a id="3"></a><a href="http://ffta.mimigyaru.com/missions,affiche_001-moisson-dherbe.html#3"
                                        class="simple">
                                        <img src="http://ffta.mimigyaru.com/medias/divers/mission_batail.png" alt="Moisson d'herbe"
                                            class="img_middle" title="Moisson d'herbe" /></a>&nbsp;<a href="http://ffta.mimigyaru.com/missions,affiche_001-moisson-dherbe.html#3">001-Moisson
                                                d'herbe</a>
                                </p>
                                <!-- ... -->
                            </div>
                        </td>
                    </tr>
                    <tr>
                        <!-- ... -->
                    </tr>
                </table>
                </form>
            </div>
        </div>
        <!-- ... -->
    </div>
</body>
</html>

我想选择&lt;table&gt; 节点,它是&lt;form&gt; 节点的第一个子节点。
我写了以下代码:

HtmlDocument l_missionsDoc = new HtmlDocument();
l_missionsDoc.Load(l_stream);

XPathNavigator l_navigator = l_missionsDoc.CreateNavigator();
XPathNodeIterator l_iterator = l_navigator.Select("//form[@id='formliste']/table");

if (l_iterator.Count <= 0) continue;

l_iterator.Count 等于 0 但必须等于 1。
我的 xPath 选择有什么问题?
任何帮助将不胜感激。

【问题讨论】:

    标签: parsing xpath html-agility-pack


    【解决方案1】:

    这是因为 HTML Agility Pack 对 FORM 标记进行了特殊处理。原因在这里描述:HtmlAgilityPack -- Does <form> close itself for some reason?

    因此,您基本上需要像这样删除该特殊处理(必须在任何加载之前发生):

    // instruct the library to treat FORM like any other tag
    HtmlNode.ElementsFlags.Remove("form");
    
    HtmlDocument l_missionsDoc = new HtmlDocument();
    l_missionsDoc.Load(l_stream);
    
    XPathNavigator l_navigator = l_missionsDoc.CreateNavigator();
    XPathNodeIterator l_iterator = l_navigator.Select("//form[@id='formliste']/table");
    
    if (l_iterator.Count <= 0) continue;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多