实现代码使用 HtmlAgilityPack 库 和 XPath 表达式抓取博客园数据。步骤如下:
1. 安装HtmlAgilityPack库
在Visual Studio中,右键解决方案,选择"管理NuGet程序包",在搜索框中输入"HtmlAgilityPack",安装最新版本。
2. 加载页面并获取HTML代码
使用WebClient实例获取博客园页面的HTML代码,例如:
var web = new WebClient();
var html = web.DownloadString("https://www.cnblogs.com/");
3. 解析HTML代码获取指定的节点
使用HtmlAgilityPack解析HTML代码并获取指定的节点。常用的方法是HtmlDocument.LoadHtml()
或HtmlDocument.Load()
,示例代码如下:
// 加载HTML
var doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(html);
// 获取指定节点
var node = doc.DocumentNode.SelectSingleNode("//div[@id='post_list']");
其中,SelectSingleNode()
选择第一个匹配XPath表达式的节点,//div
表示选择div节点,[@id='post_list']
表示选择id为post_list的节点。
4. 遍历节点获取数据
使用SelectNodes()
获取指定节点的所有子节点,并遍历获取需要的数据。示例代码如下:
var postList = node.SelectNodes(".//div[@class='post_item']");
foreach (var post in postList)
{
var titleNode = post.SelectSingleNode(".//a[@class='titlelnk']");
var title = titleNode.InnerText;
var authorNode = post.SelectSingleNode(".//a[@class='lightblue']");
var author = authorNode.InnerText;
// TODO: 其他数据的获取
}
其中,SelectNodes(".//div[@class='post_item']")
表示选择class为post_item的所有div节点,.//
表示选择当前节点及其所有子孙节点,SelectSingleNode(".//a[@class='titlelnk']")
表示选择class为titlelnk的a节点,并获取其InnerText。
示例1:获取博客园首页文章列表的数据
var web = new WebClient();
var html = web.DownloadString("https://www.cnblogs.com/");
var doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(html);
var node = doc.DocumentNode.SelectSingleNode("//div[@id='post_list']");
var postList = node.SelectNodes(".//div[@class='post_item']");
foreach (var post in postList)
{
var titleNode = post.SelectSingleNode(".//a[@class='titlelnk']");
var title = titleNode.InnerText;
var authorNode = post.SelectSingleNode(".//a[@class='lightblue']");
var author = authorNode.InnerText;
var summaryNode = post.SelectSingleNode(".//p[@class='post_item_summary']");
var summary = summaryNode.InnerText.Trim();
Console.WriteLine($"Title: {title}\nAuthor: {author}\nSummary: {summary}\n\n");
}
示例2:获取博客园首页右侧推荐博客列表的数据
var web = new WebClient();
var html = web.DownloadString("https://www.cnblogs.com/");
var doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(html);
var node = doc.DocumentNode.SelectSingleNode("//div[@class='recommend_blog']");
var blogList = node.SelectNodes(".//ul[@class='content']/li");
foreach (var blog in blogList)
{
var titleNode = blog.SelectSingleNode(".//a[@class='title']");
var title = titleNode.InnerText;
var urlNode = blog.SelectSingleNode(".//a[@class='title']");
var url = urlNode.Attributes["href"].Value;
Console.WriteLine($"Title: {title}\nUrl: {url}\n\n");
}
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:使用HtmlAgilityPack XPath 表达式抓取博客园数据的实现代码 - Python技术站