Html Agility Pack解析Html -- Q&A

(有关Html Agility Pack的下载和简单使用请看我上一篇文章,这里是关于HAP使用的各种记录)


Q: 如何根据ID选择HTML结点?

A: 利用@id='xxx', e.g.,

HtmlNode bugSum = doc.DocumentNode.SelectSingleNode("//h2[@id='summary']");

Q: 如何得到结点的文字内容或Html内容?

A:

node.InnerText.Trim()
node.InnerHtml
node.OuterHtml


Q: 如何在html树结构下查找结点?

A: 比如从根节点查找id=container的div下的第一个table:

HtmlNode table = doc.DocumentNode.SelectSingleNode("//div[@id='container']/table[1]");

注意路径里"//"表示从根节点开始查找,两个斜杠‘//’表示查找所有childnodes;一个斜杠'/'表示只查找第一层的childnodes(即不查找grandchild);点斜杠".//"表示从当前结点而不是根结点开始查找。接上一行代码,比如要查找table所有直接子结点的tr:

HtmlNodeCollection tr = table.SelectNodes("./tr");

Q: 如何得到结点的ID?

A: 很简单: node.ID


Q: 如果一段html存在字符串里,是否可以用Html Agility Pack进行处理?

A:可以,先将字符串load进来,之后的处理方法一样:

//load the original html
string html = "some html stuff"
HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(@html);



Q: 我对load进来的html进行了一些处理,比如改变了一些结点内容,删除了一些结点什么的,为什么结果却没有变化?

A: 也许你忘记save你对html的改变了,假设html存在字符串中:

//load the original html
string html = "some html stuff"
HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(@html);

//make some changes
doSomething();

//save the change
var sb = new StringBuilder();
using (var writer = new StringWriter(sb))
{
    doc.Save(writer);
}

Q: 如何去掉外层的html tag只留下内容?

A: 用remove方法。假设结点<a href=xxx>ABCD</a>,你想留下ABCD而不要<a></a>,那你需要先得到这个Html结点,假设叫link:

link.ParentNode.RemoveChild(link,true);

参数true表示留下grandchild,在这里即内容ABCD; false表示将此结点连同其grandchilds一起删除。


Q: 如何插入结点?

A: 插入结点有两种方式。第一种是直接使用Insert方法:

            HtmlNode pathNode = doc.CreateElement("tr");
            HtmlNode tbody = doc.DocumentNode.SelectSingleNode("//table[1]");
            tbody.ChildNodes.Insert(0, pathNode);

这里,pathNode是需要插入的结点。我们想把它插入到table (即tbody所表示的结点)的第一行。Insert方法的第一个参数0即表示将pathNode插入到tbody中,作为其第一个Child node。

不过,当你并不清楚插入结点的位置时,此方法并不好用。比如,你想将一个新结点插入一个特定结点之前/之后,这时用InsertBefore / InsertAfter 方法会很方便:

HtmlNode parentNode = trNode.ParentNode;
HtmlNode tr = postdoc.CreateElement("tr");
parentNode.InsertBefore(tr, trNode);

这里,我们将新结点 tr 插入trNode之前。注意要在trNode的父节点上调用InsertBefore方法。


(未完待续,转载请注明出处)



  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值