如何获取每个节点的href元素和属性?

时间:2015-10-25 05:25:16

标签: c# html href html-agility-pack

我正在开发一个应该读取html的项目,找到所有匹配值的节点,然后找到所定位节点的元素和属性。 我很难弄清楚如何获得href属性和元素。

我正在使用HTMLAgilityPack。

有很多节点
  

类="中间"

贯穿整个HTML。我需要获取所有这些,并从中获取href元素和属性。以下是html的示例:

<div class="top">
        <div class="left">            
                <a href="item123">
                    <img src="url.png" border="0" />
                                    </a>
            </div>
        </div>
<div class="middle">
            <div class="title"><a href="item123">Captains Hat</a></div>

                            <div class="day">monday</div>

            <div class="city">Tuscon, AZ | 100 Days | <script typs="text/javascript">document.write(ts_to_age_min(1445620427));</script></div>

</div>

我能够获得我需要的其他属性,但不能用于&#39; href&#39;。 这是我的代码:

List<string> listResults = new List<string>();         
var doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(url);                      

//get each listing                       
foreach (HtmlNode node in doc.DocumentNode.Descendants("div").Where(d =>
                d.Attributes.Contains("class") && d.Attributes["class"].Value.Contains("middle")))
            {                
string day = node.SelectSingleNode(".//*[contains(@class,'day')]").InnerHtml; 
string city = node.SelectSingleNode(".//*[contains(@class,'city')]").InnerHtml;
string item = node.SelectSingleNode("//a").Attributes["href"].Value;

listResults.Add(day + EnvironmentNewline 
+ city + EnvironmentNewline 
+ item + EnvironmentNewline + EnvironmentNewline)
}

我上面的代码虽然给了我整个html页面的第一个href值,并且由于某种原因为每个节点提供它(通过将列表输出到消息框可见)。我认为在我的foreach循环中使用SelectSingleNode应该获得该特定节点的第一个href属性。如果是这样,为什么我要加载整个html页面的第一个href属性?

我在这里经历了很多关于使用HTLMAgilityPack获取href值的线程,但我还没有能够让它工作。

如何根据类属性选择每个节点的href属性和元素(class =&#34; middle&#34;)?

1 个答案:

答案 0 :(得分:1)

尝试替换

 string item = node.SelectSingleNode("//a").Attributes["href"].Value;

 string item = node.SelectSingleNode(".//a").Attributes["href"].Value;

除此之外,上面的代码对我有用。

可替换地:

string item = node.SelectSingleNode(".//*[contains(@class,'title')]")
              .Descendants("a").FirstOrDefault().Attributes["href"].Value;