2015-04-07 81 views
2

我尝试使用HtmlAgilityPack库解析这些html内容时遇到了很大的麻烦。HtmlAgilityPack Html节点问题

在这一段代码,我想只检索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 

...因为它们可以改变节点的数量和其托管位置。

注意,同样的URL不会包含主机名,就像重定向:

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(); 
} 
相关问题