获取文档内容

获取文档对象

1. 创建文档对象

HtmlDocument document = new HtmlDocument();Code language: JavaScript (javascript)

2. 两种加载方式

1)加载HTML字符串

document.LoadHtml(htmlString);Code language: JavaScript (javascript)

2)加载本地HTML文件(指定编码防止乱码)

document.Load(@"c:/news.html", Encoding.UTF8);Code language: JavaScript (javascript)

Windows路径推荐使用 @ 禁止转义;课件中c://news.html是写法示例。

3. 获取根节点

HtmlNode rootNode = document.DocumentNode;Code language: JavaScript (javascript)

所有xpath查询都基于rootNode进行。

节点操作

1. 从节点HTML创建新节点

HtmlNode newNode = HtmlNode.CreateNode(newsNode.OuterHtml);
  • OuterHtml:包含自身标签+内部所有HTML
  • 常用于复制节点、截取局部HTML单独解析

2. 查询节点

  • SelectSingleNode("XPath"):匹配第一个节点,返回HtmlNode
HtmlNode childNode = itemNode.SelectSingleNode("//div[1]");Code language: JavaScript (javascript)
  • SelectNodes("XPath"):匹配全部节点,返回HtmlNodeCollection

3. 读取文本与属性

  1. 获取节点内纯文本
string text = itemNode.InnerText;
  1. 获取标签属性(基础写法)
string href = itemNode.Attributes["href"].Value;Code language: JavaScript (javascript)

风险:如果标签不存在href属性,直接Attributes["href"]会返回null,代码报错。

推荐安全写法:

string href = itemNode.GetAttributeValue("href", "");Code language: JavaScript (javascript)

4. 遍历新闻列表完整示例代码

foreach (HtmlNode item in newsList)
{
    string title = item.InnerText;
    string href = item.Attributes["href"].Value;
}Code language: PHP (php)

补充

  1. 空值问题
    SelectNodes()找不到匹配节点时返回null,foreach遍历前必须判断:
if(newsList != null)
{
    foreach(var item in newsList){ ... }
}Code language: PHP (php)
  1. InnerText / InnerHtml / OuterHtml 区分
  • InnerText:只提取文字,剔除所有标签
  • InnerHtml:节点内部HTML,不含自身标签
  • OuterHtml:自身标签 + 内部全部HTML
  1. XPath小提示
    //div代表全局搜索所有div;不加//代表直接子节点匹配。

完整例子

using HtmlAgilityPack;
using System.Text;

//1.初始化文档
HtmlDocument document = new HtmlDocument();
document.Load("news.htm", Encoding.UTF8);
HtmlNode rootNode = document.DocumentNode;

//2.批量查询新闻链接
HtmlNodeCollection newsList = rootNode.SelectNodes(@"//div[@class='blk122']/a");

if(newsList != null)
{
    foreach (HtmlNode item in newsList)
    {
        string title = item.InnerText.Trim();
        string link = item.GetAttributeValue("href", "");
        Console.WriteLine($"标题:{title} 链接:{link}");
    }
}Code language: JavaScript (javascript)

Previous:

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注