C# 如何使用Html Agility Pack获取img/src或a/hrefs?
我想使用HTML agility pack解析HTML页面上的图像和href链接,但我对XML或XPath知之甚少。虽然在许多网站上查找了帮助文档,但我无法解决这个问题。此外,我在VisualStudio 2005中使用了C。而且我不能流利地说英语,所以,我衷心感谢能够编写一些有用代码的人。主页上的功能与此非常相似,但请考虑:C# 如何使用Html Agility Pack获取img/src或a/hrefs?,c#,.net,html,html-parsing,html-agility-pack,C#,.net,Html,Html Parsing,Html Agility Pack,我想使用HTML agility pack解析HTML页面上的图像和href链接,但我对XML或XPath知之甚少。虽然在许多网站上查找了帮助文档,但我无法解决这个问题。此外,我在VisualStudio 2005中使用了C。而且我不能流利地说英语,所以,我衷心感谢能够编写一些有用代码的人。主页上的功能与此非常相似,但请考虑: HtmlDocument doc = new HtmlDocument(); doc.Load("file.htm"); // would need doc.Load
HtmlDocument doc = new HtmlDocument();
doc.Load("file.htm"); // would need doc.LoadHtml(htmlSource) if it is not a file
foreach(HtmlNode link in doc.DocumentElement.SelectNodes("//a[@href"])
{
string href = link["href"].Value;
// store href somewhere
}
所以你可以想象img@src,只需将每个a
替换为img
,将href
替换为src
。
您甚至可以简化为:
foreach(HtmlNode node in doc.DocumentElement
.SelectNodes("//a/@href | //img/@src")
{
list.Add(node.Value);
}
有关相对url处理,请查看
Uri
类。示例和接受的答案是错误的。它不使用最新版本编译。我试着做点别的:
private List<string> ParseLinks(string html)
{
var doc = new HtmlDocument();
doc.LoadHtml(html);
var nodes = doc.DocumentNode.SelectNodes("//a[@href]");
return nodes == null ? new List<string>() : nodes.ToList().ConvertAll(
r => r.Attributes.ToList().ConvertAll(
i => i.Value)).SelectMany(j => j).ToList();
}
私有列表解析链接(字符串html)
{
var doc=新的HtmlDocument();
doc.LoadHtml(html);
var nodes=doc.DocumentNode.SelectNodes(“//a[@href]”);
返回节点==null?新列表():nodes.ToList().ConvertAll(
r=>r.Attributes.ToList().ConvertAll(
i=>i.Value)).SelectMany(j=>j.ToList();
}
这对我很有用。也许我在这里发布答案太迟了。以下几点对我很有用:
var MainImageString = MainImageNode.Attributes.Where(i=> i.Name=="src").FirstOrDefault();
您还需要考虑文档基URL元素(
)和协议相关URL(例如//www.foo.com/bar/
)
有关更多信息,请查看:
- 关于MDN的页面
- 保罗·爱尔兰的文章
- 关于堆栈溢出的讨论
- MSDN页面
- 讨论无堆栈溢出
还有,Html Agility Pack可以解决相对路径问题吗?我得到一个错误:1.4.0.0版HTMLDocumentPack foreach的HtmlDocument对象中不存在DocumentElement(doc.DocumentNode.SelectNodes中的HtmlNode链接(“//a[@href]”){HtmlAttribute att=link.Attributes[“href]”);
var htmlDoc = new HtmlDocument();
htmlDoc.LoadHtml(html);
string name = htmlDoc.DocumentNode
.SelectNodes("//td/input")
.First()
.Attributes["value"].Value;