Разбор внутреннего HTML - PullRequest
2 голосов
/ 27 июля 2011

Это то, что я хочу проанализировать

<div class="photoBox pB-ms">
<a href="/user_details?userid=ePDZ9HuMGWR7vs3kLfj3Gg">
<img width="100" height="100" alt="Photo of Debbie K." src="http://s3-media2.px.yelpcdn.com/photo/xZab5rpdueTCJJuUiBlauA/ms.jpg">
</a>
</div>

Я использую следующий XPath, чтобы найти его

HtmlNodeCollection bodyNode = htmlDoc.DocumentNode.SelectNodes("//div[@class='photoBox pB-ms']");

Все в порядке и возвращаюсь, все мои div с фотобоксомclass

Но когда я хочу получить ahref, используя

HtmlNodeCollection bodyNode = htmlDoc.DocumentNode.SelectNodes("//div[@class='photoBox pB-ms'//a href]");

, я получил ошибочный токен ошибки.

Также я попытался использовать запрос

   var lowestreview =
  from main in htmlDoc.DocumentNode.SelectNodes("//div[@class='photoBox pB-ms']") 
   from rating in main.SelectNodes("//a href")
  select new { Main=main.Attributes[0].Value,AHref = rating.ToString() };

Кто-нибудь подскажет, как написать XPath или запрос, чтобы получить этот AHref

Ответы [ 2 ]

3 голосов
/ 27 июля 2011

Это работает (проверено):

HtmlNodeCollection bodyNodes = htmlDoc.DocumentNode
                                      .SelectNodes("//div[@class='photoBox pB-ms']/a[@href]");
foreach(var node in bodyNodes)
{
    string href = node.Attributes["href"].Value;
}

Проблема в том, что вы перепутали селекторы атрибутов и элементов.Кроме того, из вашего вопроса неясно, действительно ли вы намеревались запросить коллекцию .

. Вышеупомянутый селектор XPath выберет все элементы a с атрибутом href, которые являются дочерними узлами.элемента div с классом 'photoBox pB-ms'.Затем вы можете выполнить итерацию этой коллекции и получить значение атрибута href для каждого элемента.

Кроме того, теперь HtmlAgilityPack поддерживает Linq (начиная с версии 1.4), поэтому просто получить определенное значение атрибута можно гораздо проще (как, например, imo)это:

string hrefValue = htmlDoc.DocumentNode
                          .Descendants("div")
                          .Where(x => x.Attributes["class"].Value == "photoBox pB-ms")
                          .Select(x => x.Element("a").Attributes["href"].Value)
                          .FirstOrDefault();
1 голос
/ 27 июля 2011

Вместо разбора XML вы можете использовать HTMLAgilePack

HtmlDocument doc = new HtmlDocument();
doc.LoadHtml([HTML Text]);
foreach(HtmlNode link in doc.DocumentElement.SelectNodes("//a[@href"])
{
    HtmlAttribute att = link["href"];
    // att.Value
}
...