我想从网页上获取数据:
<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!
答案 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()
并迭代它们在每次迭代中决定是否有正确的一个)
下面是一个设置简单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();