【问题标题】:Html nodes issue with HtmlAgilityPackHtmlAgilityPack 的 Html 节点问题
【发布时间】:2015-04-07 15:39:35
【问题描述】:

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

在这段代码中,我想只检索引用 uploaded.net 的 url (href),但我无法确定该 url引用它。

<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 中我能做什么?

【问题讨论】:

    标签: c# html .net vb.net html-agility-pack


    【解决方案1】:

    这应该可以,但未经测试:

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

    也使用包含,因为您永远不知道文本是否包含空格。

    【讨论】:

    • 谢谢,这是最简单最棒的答案,那是什么黑魔法?这些句子真的是 XPATH 语法的一部分吗?只有一个问题:“包含”不区分大小写?如果是,那么它就是完美的。
    • @ElektroStudios 是的,它区分大小写,你想让它不区分大小写吗?你可以,但它会变得丑陋
    • @ElektroStudios 在 XPATH2 中你可以,但据我所知,HAP 仅支持 XPATH 1.0,仍然在 XPATH 1.0 中,如果它变得非常复杂,你有像开始 - 结束 - 子字符串等功能那是我使用 Linq 和正则表达式的时候
    • @ElektroStudios 但请注意它肯定是contains(text(),'ploaded')
    【解决方案2】:

    我看到这个工作的唯一方法是 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。

    很抱歉代码不是那么干净且容易出错,但它应该能让你朝着正确的方向前进。

    【讨论】:

    • 非常感谢 h4 的索引方法!
    【解决方案3】:

    提供您提供的 sn-p,这将帮助您入门。

    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();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-26
      • 1970-01-01
      相关资源
      最近更新 更多