簡體   English   中英

如何解析HTML以修改所有單詞

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM