从HTML解析属性值

时间:2014-09-17 10:15:26

标签: c# html parsing

我想从网页上获取数据:

<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);
不要问我怎么做,但我做到了。感谢您的时间CopyPaste!

1 个答案:

答案 0 :(得分:1)

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

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

由于您在评论中要求进一步澄清,我希望至少能解决您的一些问题:

第一个Html Agility Pack适用于节点,这就是html标签(如<embed>)转换成的内容。

您想要获取的值是该节点上的属性,因此您需要先选择该节点。

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

现在你差不多完成了,现在你只需要xpath-expression来告诉解析器在哪里查找你的节点,如果你不能为该节点分配一个id,你将不得不尝试通过文档结构找到它< em>(例如:body体内div节点内的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();