【问题标题】:Parse attribute value from HTML从 HTML 解析属性值
【发布时间】:2014-09-18 16:26:44
【问题描述】:

我想从网页获取数据:

<embed type="application/x-vlc-plugin" 
    name="vlc" ratio="16:9" 
    autoplay="yes" loop="no" 
    rtsp-caching="3000" volume="100" 
    width="670" height="380" 
    target="http://185.2.42.106/stream/?d=1402956552&token=5119675517383">

我想获取目标属性值。我搜索了整个互联网,没有找到任何我理解的东西。有人能告诉我诀窍并解释一下吗?

好的,所以我可以使用以下代码:

        var webGet = new HtmlWeb();
        var doc = webGet.Load("http://www.spusti.net/play-vlc-185");
        HtmlNode node = doc.DocumentNode.SelectNodes("//embed")[0];
        var val = node.Attributes["target"].Value; //10743
        MessageBox.Show(val);

不要问我是怎么做的,但我做到了。感谢您花时间复制粘贴!

【问题讨论】:

  • 你看Html Agility Pack了吗?这应该符合您的需求。
  • 于是我搜索了一下,发现Html Agility Pack不支持属性选择-htmlagilitypack.codeplex.com/discussions/1720这是真的吗?
  • 如果您尝试解析数据,请查看XPath。您可以将XPathHtml Agility Pack 结合使用,以获得所需的一切。或许看了XPath的相关内容,你就会明白DrCopyPaste的回答了。
  • 很高兴它为您工作;我只想指出一件事:您现在正在使用SelectNodes("//embed")-method,它基本上会在root 下为您提供所有embed-nodes,然后您只需通过附加[0] 来选择第一个,只要该目标页面的结构改变了该策略可能不再起作用(即,如果在该页面上已经存在的那个之前插入了一个额外的embed-node,那么该策略将不再起作用)。不管怎样,你的工作代码很有趣;)
  • 感谢您的提示。页面不应该改变,它现在可以工作,但将来知道这一点是件好事。再次感谢您的宝贵时间,祝您有美好的一天。 :)

标签: c# html parsing


【解决方案1】:

the link you commented on 中讨论的事情是您在这个库中的节点上工作,而不是直接在属性上工作。 (您使用XPATH 指向您要在该库中选择的内容,虽然XPATH 本身支持选择属性,但HTML Agility Pack 不支持,它只支持选择节点)

也就是说,属性是节点的一部分,这对你来说应该没问题! 您可以从Html Agility Pack 中选择的节点轻松获取属性值。

既然您在评论中要求进一步澄清,我希望我至少可以解决您的一些问题:

第一个 Html Agility Pack 适用于节点,这就是 html-tag(如 &lt;embed&gt;)被转换成的内容。

你要获取的值是那个节点上的一个属性,所以你需要先选择那个节点。

为了能够选择您需要识别的节点,最简单的方法(如果您可以控制 html 源代码)就是为其分配一个 id (如 &lt;embed id='someId' someAttribute='someValue' /&gt;)。

现在你差不多完成了,现在你只需要 xpath 表达式告诉解析器在哪里寻找你的节点,如果你不能为那个节点分配一个 id 你将不得不尝试通过文档结构找到它 (例如:body 内部的 div-node 内的 embed-node,但是您可以获得一组节点,而不仅仅是一个,那么您将需要使用 SelectNodes() 并遍历它们并决定每次迭代,如果你选对了)

TLDR;

以下是设置一个简单 html 的示例,其中两个节点具有相同的标签类型,具有不同的 id,代码仅选择其中一个节点并输出 someAttribute 的属性值(请注意在您的生产代码中您应该在使用它之前检查该属性是否存在;))

// to run this start a new console project in visual studio
// and paste this code into main method of program.cs
// open nuget package console and type "Install-Package HtmlAgilityPack"
// and hit enter
// add a "using HtmlAgilityPack;"
HtmlDocument doc = new HtmlDocument();
string someStupidHtml = @"
<html>
    <head>
        <title>jusATest</title>
    </head>
    <body>
        <embed id='someId' someAttribute='someValue' />
        <embed id='anotherId' someAttribute='anotherValue' />
    </body>
</html>";

byte[] byteArray = Encoding.UTF8.GetBytes(someStupidHtml);
MemoryStream stream = new MemoryStream(byteArray);
doc.Load(stream);
HtmlNode node = doc.DocumentNode.SelectSingleNode("//embed[@id='anotherId']");

Console.WriteLine("its a node already with someAttribute={0}", node.Attributes["someAttribute"].Value);

Console.Read();

【讨论】:

  • 感谢您抽出宝贵时间,但我对您所写的内容几乎一无所知。我对解析,这个库和周围的东西真的很陌生。如果你有时间,你能解释一下吗?我尝试将其复制并粘贴到一个新项目中,即使这样我也遇到了错误。
  • @user3890664 我试图改进我的帖子,但现在它看起来像一堵可怕的文字墙,但我希望我能消除你的一些顾虑。
  • 所以在多次阅读你的答案之后,我仍然没有理解一些东西,所以我搜索和搜索,最后我得到了它与我“编辑”到答案的代码一起工作。不要问我是怎么做到的,但我做到了。 :D 感谢您的时间 CopyPaste!
猜你喜欢
  • 1970-01-01
  • 2023-02-10
  • 2021-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-12
  • 2012-08-24
相关资源
最近更新 更多