[英]How to parse HTML to modify all words
这似乎是一个反复出现的问题,但这里有。
我有格式良好的HTML(它来自受控源,所以这可以被认为是给定的)。 我需要遍历HTML正文的内容,查找文档中的所有单词,对这些单词执行一些编辑,然后保存结果。
例如,我有文件sample.html,我想通过我的应用程序和产品output.html运行它,这与原始文件完全相同,加上我的编辑。
我发现以下使用HTMLAgilityPack,但我发现的所有示例都是查看指定标记的属性 - 是否有一个简单的修改,它将查看内容并执行我的编辑?
HtmlDocument HD = new HtmlDocument();
HD.Load (@"e:\test.htm");
var NoAltElements = HD.DocumentNode.SelectNodes("//img[not(@alt)]");
if (NoAltElements != null)
{
foreach (HtmlNode HN in NoAltElements)
{
HN.Attributes.Append("alt", "no alt image");
}
}
HD.Save(@"e:\test.htm");
以上是查找没有ALT标签的图像标签。 我想查找文件的<body>
中的所有标记,并对内容执行某些操作(可能涉及在此过程中创建新标记)。
我可能做的一个非常简单的示例是采用以下输入:
<html>
<head><title>Some Title</title></head>
<body>
<h1>This is my page</h1>
<p>This is a paragraph of text.</p>
</body>
</html>
并产生输出,它取每个单词并交替使其成为大写并使其成斜体:
<html>
<head><title>Some Title</title></head>
<body>
<h1>THIS <em>is</em> MY <em>page</em></h1>
<p>THIS <em>is</em> A <em>paragraph</em> OF <em>text</em>.</p>
</body>
</html>
想法,建议?
就个人而言,鉴于此设置,我将使用HtmlNode的InnerText属性来查找单词(可能使用Regex,因此我可以排除标点符号而不是简单地依赖空格)然后使用InnerHtml属性使用迭代调用进行更改到Regex.Replace(因为Regex.Replace有一个方法,允许你指定开始位置和要替换的次数)。
处理代码:
IEnumerable<HtmlNode> nodes = doc.DocumentNode.DescendantNodes().Where(n => n.InnerText == "something");
foreach (HtmlNode node in nodes)
{
string[] words = getWords(node.InnerText);
node.InnerHtml = processHtml(node.InnerHtml, words);
}
识别单词(可能有一些更明智的方法来做到这一点,但这是一个初始的刺伤):
private string[] getWords(string text)
{
Regex reg = new Regex("/w+");
MatchCollection matches = reg.Matches(text);
List<string> words = new List<string>();
foreach (Match match in matches)
{
words.Add(match.Value);
}
return words.ToArray();
}
处理html:
private string processHtml(string html, string[] words)
{
int startPosition = 0;
foreach (string word in words)
{
startPosition = html.IndexOf(word, startPosition);
Regex reg = new Regex(word);
html = reg.Replace(html, alterWord(word), 1, startPosition);
}
return html;
}
我会把alterWord()的细节留给你。 :)
尝试.SelectNodes("//body//*")
。 这将获得任何body
元素中任何深度的所有元素。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.