如何使用HTML Agility Pack编辑HTML片段
所以我有一个HTML代码片段,我想用C#修改。
This is a specialSearchWord that I want to link to A hyperlink Some more text and that specialSearchWord again.
我想把它转换成这个:
This is a specialSearchWord that I want to link to A hyperlink Some more text and that specialSearchWord again.
我将根据这里的许多建议使用HTML Agility Pack,但我不知道我要去哪里。 特别是,
- 如何将部分片段加载为字符串,而不是完整的HTML文档?
- 怎么编辑?
- 然后如何返回已编辑对象的文本字符串?
- 与完整的HTML文档相同。 没关系。
- 有两个选项:您可以直接编辑
InnerHtml
属性(或Text
节点上的文本)或使用例如AppendChild
,PrependChild
等修改dom树。 - 您可以使用
HtmlDocument.DocumentNode.OuterHtml
属性或使用HtmlDocument.Save
方法(我个人更喜欢第二个选项)。
至于解析,我选择在div
包含搜索词的文本节点,然后使用string.Replace
方法替换它:
var doc = new HtmlDocument(); doc.LoadHtml(html); var textNodes = doc.DocumentNode.SelectNodes("/div/text()[contains(.,'specialSearchWord')]"); if (textNodes != null) foreach (HtmlTextNode node in textNodes) node.Text = node.Text.Replace("specialSearchWord", "specialSearchWord");
并将结果保存为字符串:
string result = null; using (StringWriter writer = new StringWriter()) { doc.Save(writer); result = writer.ToString(); }
回答:
- 可能有办法做到这一点,但我不知道如何。 我建议加载整个文件。
- 使用XPath和正则表达式的组合
- 有关人为举例,请参阅下面的代码。 您可能还有其他未提及的约束,但此代码示例应该可以帮助您入门。
请注意,您的Xpath表达式可能需要更复杂才能找到所需的div。
HtmlDocument doc = new HtmlDocument(); doc.Load(yourHtmlFile); HtmlNode divNode = doc.DocumentNode.SelectSingleNode("//div[2]"); string newDiv = Regex.Replace(divNode.InnerHtml, @"specialSearchWord", "specialSearchWord"); divNode.InnerHtml = newDiv; Console.WriteLine(doc.DocumentNode.OuterHtml);