【问题标题】:C# Html Agility Pack parsing tags with multiple alternativesC# Html Agility Pack 解析具有多种选择的标签
【发布时间】:2016-05-10 09:12:40
【问题描述】:

我对 HTML 没有任何经验,请原谅任何不正确的术语。

我正在尝试使用 HTML Agility Pack 解析 HTML 文档,并且正在寻找一个非常具体的字符串。

我要获取表单的所有字符串:

<img src="..." etc=....">

所以我的选择参数是

HtmlNodeCollection images = doc.DocumentNode.SelectNodes("//img[@src]");

但是,这最终也会返回字符串,例如

<img width="..." src="..." etc="..">

在我看来(至少据我所知):搜索 img 标签和 src 只需要在同一级别上找到,不一定在 img 标签旁边。

查看文档后,我觉得我正在尝试使用此功能做一些我不允许做的事情。

有人可以建议正确的方法来做到这一点。谢谢!

【问题讨论】:

    标签: c# html tags html-agility-pack


    【解决方案1】:

    "搜索img标签和src只需要在同一层找到,不一定就在img标签旁边。 em>"

    您似乎想找到&lt;img&gt; 元素,其中src 属性是第一个属性。请注意,XML/HTML 解析器不必保留属性顺序,因此通常您不希望根据某些属性顺序选择元素,即 src 属性首先出现的位置,等等。

    无论如何,在我过于简化的测试中,HAP 恰好保留了属性顺序,因此使用Attributes[0].Name* 检查第一个属性的名称也有效:

    var raw = @"<div>
        <img src=""..."" etc=""...."">
        <img width=""..."" src=""..."" etc="".."">
        <img>
    </div>";
    var doc = new HtmlDocument();
    doc.LoadHtml(raw);
    var result = doc.DocumentNode
                    .SelectNodes("//img[@src]")
                    .Where(o => o.Attributes[0].Name == "src")
                    .ToList();
    foreach (var item in result)
    {
        Console.WriteLine(item.OuterHtml);
    }
    

    输出:

    <img src="..." etc="....">
    

    *) XPath 已经过滤了具有src 属性的img 元素,所以Attributes[0].Name 永远不会产生NRE,如果您担心的话。

    【讨论】:

    • 我对发帖者的问题有了不同的理解——他只想要具有 src 和 etc 属性的 img 节点。让我们看看发帖人是如何回答的。
    • 我最初想建议您的答案中当前的内容,但后来我意识到,etc,OP 可能意味着说 其他一些属性,而不是字面意义上的属性名称 @ 987654331@。我引用的话似乎支持这个想法(OP 意味着别的)..
    • 哦...那不公平 :-)
    • @Veverke 别担心,我的水晶球只是偶尔工作:D
    • @har07 你正确地理解了我,这正是我想要的。谢谢!
    【解决方案2】:

    我不熟悉 XPATH,所以我假设你的是正确的(除了 HtmlAgilityPack 之外,我通常使用使用 ScrapySharp 库的 css 选择器)。

    以下控制台项目代码 sn-p 将仅返回您想要的 img 节点,即仅具有 2 个属性的节点 - src 等,不多不少。 我手动加载了一个带有 3 个图像节点的示例 html,如下所示:

            HtmlDocument doc = new HtmlDocument();
            string html = @"
                <img src='img1.jpg' />
                <img src='img1.jpg' etc='etcValue' />
                <img width='200px' src='img1.jpg' />
            ";
            doc.LoadHtml(html);
    
            var relevantImgNodes = doc.DocumentNode.SelectNodes("//img")
                .Where(n => 
                    n.Attributes.Count == 2 && 
                    !string.IsNullOrEmpty(n.GetAttributeValue("src")) && 
                    !string.IsNullOrEmpty(n.GetAttributeValue("etc")));
    
            Console.WriteLine(relevantImgNodes.Count()); // prints 1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-09-11
      • 2011-07-21
      • 1970-01-01
      • 2011-01-16
      • 1970-01-01
      • 2018-12-03
      • 2011-06-12
      相关资源
      最近更新 更多