2015-04-07 2 views
2

У меня возникли большие проблемы с попыткой проанализировать содержимое этих html с помощью библиотеки HtmlAgilityPack.Html node issue with HtmlAgilityPack

В этой части кода, я хотел бы получить только URL (HREF), что reffers к uploaded.net, но я не могу определить, является ли URL-адрес reffers к нему.

<div class='downloads' id='download_block'> 

    <h5 style='text-align:center'>FREE DOWNLOAD LINKS</h5> 

    <h4>uploadable.ch</h4> 
    <ul class='parts'> 
     <li> 
      <a href="http://url/..." target="_blank"> text here</a> 
     </li> 
    </ul> 

    <h4>uploaded.net</h4> 
    <ul class='parts'> 
     <li> 
      <a href="http://url/..." target="_blank"> text here</a> 
     </li> 
    </ul> 

    <h4>novafile.com</h4> 
    <ul class='parts'> 
     <li> 
      <a href="http://url/..." target="_blank"> text here</a> 
     </li> 
    </ul> 

</div> 

Вот как это выглядит на веб-странице

enter image description here

И это то, что у меня есть:

nodes = myHrmlDoc.DocumentNode.SelectNodes(".//div[@class='downloads']/ul[@class='parts']") 

Я не могу просто использовать массив-индекс для определения позиция, подобная:

nodes(0) = uploadable.ch node 
nodes(1) = uploaded.net node 
nodes(2) = novafile.com node 

... потому что они могут изменять количество узлов и их хостинговых позиций.

Обратите внимание, что также URLs не содержит хостинг имена, являются переназначения как:

http://xxxxxx/r/YEHUgL44xONfQAnCNUVw_aYfY5JYAy0DT-i--

Что я мог сделать в C# или VB.Net еще ?.

ответ

2

это должно сделать, непроверенных хотя:

doc.DocumentNode.SelectSingleNode("//h4[contains(text(),'uploaded.net')]/following-sibling::ul//a").Attributes["href"].Value 

также использовать содержит, потому что вы никогда не знаете, если текст содержит пробелы.

+0

Спасибо, это самый простой и удивительный ответ, что это за черная магия? эти предложения действительно являются частью синтаксиса XPATH ?. только один вопрос: «содержит» не учитывает регистр? если да, то это просто отлично. – ElektroStudios

+0

@ElektroStudios да, это чувствительный к регистру, вы хотите сделать его случайным? вы можете, но он станет уродливым –

+0

Я должен сделать его нечувствительным к регистру, чтобы предотвратить будущие головные боли, если бы вы могли мне помочь – ElektroStudios

1

Единственный способ, с которым я вижу эту работу, - это 2-кратный подход. Извините, у меня нет HtmlAgilityPack под рукой, но вот пример использования стандарта XmlDocument. Несмотря на то, что вы сказали, что не можете использовать индексы массивов для доступа, этот процесс должен позволить вам сделать это, специально присвоив правильный индекс динамически.

void Main() 
{ 
    var xml = @" 
<div class=""downloads"" id=""download_block""> 
    <h5 style=""text-align:center"">FREE DOWNLOAD LINKS</h5> 
    <h4>uploadable.ch</h4> 
    <ul class=""parts""> 
     <li> 
      <a href=""http://url/..."" target=""_blank""> text here</a> 
     </li> 
    </ul> 
    <h4>uploaded.net</h4> 
    <ul class=""parts""> 
     <li> 
      <a href=""http://upload.net/..."" target=""_blank""> text here</a> 
     </li> 
    </ul> 
    <h4>novafile.com</h4> 
    <ul class=""parts""> 
     <li> 
      <a href=""http://url/..."" target=""_blank""> text here</a> 
     </li> 
    </ul> 
</div>"; 

var xmlDocument = new XmlDocument(); 
xmlDocument.LoadXml(xml); 

var nav = xmlDocument.CreateNavigator(); 
var index = nav.Evaluate("count(//h4[text()='uploaded.net']/preceding-sibling::h4)+1").ToString(); 
var text = xmlDocument.SelectSingleNode("//ul["+index +"]//a/@href").InnerText; 

Console.WriteLine(text); 
} 

В основном, он получает индекс uploaded.neth4, а затем использует этот индекс, чтобы выбрать правильный ul тег и получить URL вне базового тега привязки.

Извините за не очень чистый и подверженный ошибкам код, но он должен привести вас в правильном направлении.

+0

Большое спасибо за индексный подход h4! – ElektroStudios

1

Дайте предоставленный фрагмент, это поможет вам начать работу.

var page = "<div class=\"downloads\" id=\"download_block\"> <h5 style=\"text-align:center\">FREE DOWNLOAD LINKS</h5> <h4>uploadable.ch</h4> <ul class=\"parts\">  <li>   <a href=\"http://url/...\" target=\"_blank\"> text here</a>  </li> </ul> <h4>uploaded.net</h4> <ul class=\"parts\">  <li>   <a href=\"http://url/...\" target=\"_blank\"> text here</a>  </li> </ul> <h4>novafile.com</h4> <ul class=\"parts\">  <li>   <a href=\"http://url/...\" target=\"_blank\"> text here</a>  </li> </ul></div>"; 

HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument(); 
doc.LoadHtml(page); 

var nodes = doc.DocumentNode.Descendants("h4").Where(n => n.InnerText.Contains("uploadable")); 
foreach (var node in nodes) 
{ 
    var attr = node.NextSibling.NextSibling.Descendants().Where(x=> x.Name == "a").FirstOrDefault().Attributes["href"]; 
    attr.Value.Dump(); 
}