Html Agility Pack SelectSingleNode 在迭代中总是给出相同的结果?

Posted

技术标签:

【中文标题】Html Agility Pack SelectSingleNode 在迭代中总是给出相同的结果?【英文标题】:Html Agility Pack SelectSingleNode giving always same result in iteration? 【发布时间】:2013-02-17 14:06:08 【问题描述】:

我想要集合中的节点,但是通过迭代 SelectSingleNode 我不断得到相同的对象,只是 node.Id 正在改变...... 我尝试的是读出给定站点的网络响应,并在特殊定义的元素中捕获一些信息,如值、链接……。

int offSet = 0;
string address = "http://www.testsite.de/ergebnisliste.html?offset=" + offSet;

HtmlWeb web = new HtmlWeb();
//web.OverrideEncoding = Encoding.UTF8;
HtmlDocument doc = web.Load(address);

HtmlNodeCollection collection = doc.DocumentNode.SelectNodes("//div[@itemtype='http://schema.org/Posting']");

foreach (HtmlNode node in collection) 
    string id = HttpUtility.HtmlDecode(node.Id);
    string cpname = HttpUtility.HtmlDecode(node.SelectSingleNode("//span[@itemprop='name']").InnerText);
    string cptitle = HttpUtility.HtmlDecode(node.SelectSingleNode("//span[@itemprop='title']").InnerText);
    string cpaddress = HttpUtility.HtmlDecode(node.SelectSingleNode("//span[@itemprop='addressLocality']").InnerText);
    string date = HttpUtility.HtmlDecode(node.SelectSingleNode("//div[@itemprop='datePosted']").InnerText);
    string link = "http://www.testsite.de" + HttpUtility.HtmlDecode(node.SelectSingleNode("//div[@class='h3 title']//a[@href]").GetAttributeValue("href", "default"));               

这是例如 1 次迭代:

<div id="66666" itemtype="http://schema.org/Posting">   
<div>
    <a>
        <img />
    </a>
</div>
<div>
    <div class="h3 title">
        <a href="/test.html"  title="Test">
            <span itemprop="title">Test</span>
        </a>
    </div>
    <div>
        <span itemprop="name">TestName</span>       
    </div>
</div>
<div>
    <div>
        <div>
            <div>
                <span itemprop="address">Test</span>
            </div>
            <span>                     
                <a>
                    <span><!-- --></span>
                    <span></span>
                </a>
            </span>         
        </div>
    </div>      
    <div itemprop="date">
        <time datetime="2013-03-01">01.03.13</time>
    </div>
</div>

【问题讨论】:

***.com/questions/6181014/… 【参考方案1】:

通过写作

node.SelectSingleNode("//span[@itemprop='name']").InnerText

就像你写的一样

doc.DocumentNode.SelectSingleNode("//span[@itemprop='name']").InnerText

要做你想做的事,你应该这样写:node.SelectSingleNode(".//span[@itemprop='name']").InnerText

这个.dot/句号告诉在当前节点上搜索node而不是doc

【讨论】:

很棒的答案!非常感谢Loclip!

以上是关于Html Agility Pack SelectSingleNode 在迭代中总是给出相同的结果?的主要内容,如果未能解决你的问题,请参考以下文章

HTML Agility Pack 条带标签不在白名单中

Html Agility Pack/C#:如何创建/替换标签?

使用 HTML Agility Pack 替换 HTML div InnerText 标签

如何使用 Html Agility Pack 使请求超时

Html Agility Pack 与 302 重定向到同一页面

如何使用 HTML Agility Pack 修复格式错误的 HTML?