C#Html Agility Pack解析具有多个备选方案的标签

时间:2016-05-10 09:12:40

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

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

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

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

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

所以我的选择参数是

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

但是,这也会导致返回

等字符串
<img width="..." src="..." etc="..">

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

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

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

2 个答案:

答案 0 :(得分:1)

  

搜索img标记, src 只需要在同一级别找到,不一定标记旁边的

您似乎想要找到<img>元素,其中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已经过滤了具有属性img的{​​{1}}元素,因此如果您担心,src将永远不会产生NRE。

答案 1 :(得分:0)

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

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

completionHandler()