我在尝试用HtmlAgilityPack
库解析这些html内容时遇到了很大麻烦。
在这段代码中,我想只检索引用 uploaded.net 的网址( href ),但我无法确定网址是否正确参考它。
<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>
这就是它在网页上的显示方式
这就是我所拥有的:
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
...因为他们可以改变节点数量及其托管位置。
请注意,网址也不包含主机名,重定向如下:
http://xxxxxx/r/YEHUgL44xONfQAnCNUVw_aYfY5JYAy0DT-i--
我可以用C#或VB.Net做什么?
答案 0 :(得分:2)
这应该做,但未经测试:
doc.DocumentNode.SelectSingleNode("//h4[contains(text(),'uploaded.net')]/following-sibling::ul//a").Attributes["href"].Value
也使用contains,因为你永远不知道文本是否包含空格。
答案 1 :(得分: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.net h4
的索引,然后使用该索引选择正确的ul
标记并获取基础锚点的URL标签
对于不那么干净且容易出错的代码感到抱歉,但它应该让你朝着正确的方向前进。
答案 2 :(得分: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();
}