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

Posted

技术标签:

【中文标题】如何获取每个节点的 href 元素和属性?【英文标题】:How to get href elements and attributes for each node? 【发布时间】:2016-01-24 09:59:28 【问题描述】:

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

我正在使用 HTMLAgilityPack。 我有很多节点

class="中间"

在整个 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>

我已经能够获得我需要的其他属性,但不是'href'。 这是我的代码:

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 值的线程,但我无法让它工作。

如何根据类属性 (class="middle") 获取我选择的每个节点的 href 属性和元素?

【问题讨论】:

【参考方案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; 

【讨论】:

使用“.//a”而不是“//a”确实解决了它总是选择在 html 中找到的第一个 href 的问题。关于获取 href 条目的元素的任何想法?从上面我想返回:“Captains Hat”。 我能够通过使用以下方法获得 href 的元素值:string item = node.SelectSingleNode(".//a").InnerHtml.

以上是关于如何获取每个节点的 href 元素和属性?的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript 学习-32.HTML DOM 获取和修改属性节点

vue3的根节点

从 jQuery 集合中获取每个元素的属性值,放入数组中

如何获取具有指定href属性的所有元素

如何检查未知的 XML 文件以获取其元素或属性?

javascript_获取iframe框架中元素节点的属性值