繁体   English   中英

C#HtmlAgilityPack:遍历节点时出错

[英]C# HtmlAgilityPack : Error looping throough nodes

我正在遍历一些<li>标签,并且在此标签中有一个class="track-visit-website"<a>标签:

<li><a class="track-visit-website" href="abc1">Anchor1</a></li>

我想获取<a>标签的href。 但是在某些<li>中没有<a>标记,因此我的代码抛出错误。

我的代码是:

List<string> Website = new List<string>();
HtmlDocument hoteleWebsiteDoc = new HtmlDocument();
hoteleWebsiteDoc.LoadHtml(hotels.InnerHtml);

var hotelWebsite = from lnks in hoteleWebsiteDoc.DocumentNode.Descendants()
                    where lnks.Name == "a" && lnks.Attributes.Contains("class") &&
                      lnks.Attributes["class"] != null &&
                      lnks.Attributes["class"].Value.Contains("track-visit-website") &&
                      lnks.InnerText.Trim().Length > 0
                    select new
                    {
                     Url = lnks.Attributes["href"].Value,
                    };

foreach (var website in hotelWebsite)
{
    if (!string.IsNullOrEmpty(website.Url) || !string.IsNullOrWhiteSpace(website.Url))
        Website.Add(website.Url.Trim());
    else
        Website.Add(" ");
}

我该怎么办 ? 我想到先检查标记是否存在,然后执行代码。 但是,如何检查标签是否存在? 还是有其他方法?

var items = hoteleWebsiteDoc
           .DocumentNode.SelectNodes("//li/a[@class='track-visit-website']");

if(items!=null)
{
    var links = items.Select(a => a.Attributes["href"].Value).ToList();
}

此解决方案考虑a标记不包含href属性的可能情况,例如:

<li>
   <a class='track-visit-website' href='abc1'>Anchor1</a>
</li>
<li>
   <a class='track-visit-website'>Anchor 2</a>
</li> 
<li> 
</li>

var hoteleWebsiteDoc = (from element in doc.DocumentNode.Descendants("a")
                        where element.ParentNode.Name.Equals("li") && 
                        element.Attributes.Contains("class") &&
                        element.Attributes.Contains("href") &&
                        element.Attributes["class"].Value.Equals("track-visit-website")
                        select new
                                 {
                                   URL = element.Attributes["href"].Value
                                 }).ToList();

foreach (var obj in hrefsList)
{
   Console.WriteLine(obj.URL);
}

或者,如果您想保留其他解决方案,则可以更改代码以检查是否包含href属性:

if (items != null)
{
   var links = items.Where(a => a.Attributes.Contains("href")).Select(a => a.Attributes["href"].Value).ToList();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM