Как получить элементы и атрибуты href для каждого узла?

c# href html 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>

Я смог получить другие атрибуты, которые мне нужны, но не для «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)
}

Мой код выше, хотя и дает мне первое значение href для всей html-страницы, хотя и дает его для каждого узла по какой-либо причине (видимый путем вывода списка в ящик сообщений). Я думал, что в моем цикле foreach использование SelectSingleNode должно получить первый атрибут href для этого конкретного узла. Если да, то почему я получаю первый атрибут href для всей загруженной страницы html?

Я уже много раз рассказывал о получении значений href с помощью HTLMAgilityPack, но я не смог заставить это работать.

Как я могу получить атрибут href и элементы для каждого узла, который я выбираю, исходя из атрибута класса (class = "middle")?

Принятый ответ

Попробуйте заменить

 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; 


Related

Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow