C# AngleSharp获取所有HTML标记并分配唯一的id属性

C# AngleSharp获取所有HTML标记并分配唯一的id属性,c#,anglesharp,C#,Anglesharp,是否有任何方法可以用于获取所有主体标记计数,然后为所有标记分配唯一的属性id,如“数据id=1”、“数据id=2”等 我希望测试静态网站翻译的目的,然后我将使用查询选择器[data id],从每个标记中获取文本内容,并使用翻译API翻译文本,并将翻译文本设置回最初提取的标记id C# HTML <!DOCTYPE html> <html> <head> </head> <body> <h1>My page heading&l

是否有任何方法可以用于获取所有主体标记计数,然后为所有标记分配唯一的属性id,如“数据id=1”、“数据id=2”等

我希望测试静态网站翻译的目的,然后我将使用查询选择器[data id],从每个标记中获取文本内容,并使用翻译API翻译文本,并将翻译文本设置回最初提取的标记id

C#

HTML

<!DOCTYPE html>
<html>
<head>
</head>
<body>
<h1>My page heading</h1>
<h2>This is example static page to get all the HTML tags and their <strong>childrens content </strong> and then <span>translate</span>
that into </br> another language.
</h2>
<p>Something in footer</p>
</body>
</html>

我的页面标题
这是一个静态页面示例,用于获取所有HTML标记及其儿童内容,然后进行翻译
将其转换成另一种语言。
页脚上有东西


下面的代码似乎就是这么做的。基本上,它从Body元素收集所有下行元素,循环它们并添加属性。也许你在传遍所有后代时遇到了麻烦

我将主体更新后的内部html写入文本文件,这样您就可以看到“数据id”属性

class Program
{
    static void Main(string[] args)
    {

        var response = getHtml("http://www.bbc.com");
        var html = response.Result;

        HtmlParser htmlParser = new HtmlParser();
        var parsedDoc = htmlParser.Parse(html);
        var body = parsedDoc.Body;
        var elements = getAllElements(parsedDoc.Body);

        for(var i = 0; i < elements.Count; i++)
        {
            var child = elements[i];
            child.SetAttribute("data-id", $"data-id{i + 1}");
        }

        File.WriteAllText("E:/soQuestion.txt", parsedDoc.Body.InnerHtml);
    }

    static async Task<string> getHtml(string url)
    {
        using (var httpClient = new HttpClient())
        {
            var response = await httpClient.GetAsync(url);

            //if http request did not succeeed, return empty html
            if (!response.IsSuccessStatusCode) return string.Empty;

            var content = await response.Content.ReadAsStringAsync();
            return content;
        }

    }

    static List<IElement> getAllElements(IElement element)
    {
        List<IElement> elements = new List<IElement>();

        //add element itself
        elements.Add(element);

        foreach (var child in element.Children)
        {
            //add each child elements
            elements.AddRange(getAllElements(child));
        }

        return elements;
    }
}
类程序
{
静态void Main(字符串[]参数)
{
var response=getHtml(“http://www.bbc.com");
var html=response.Result;
HtmlParser HtmlParser=新的HtmlParser();
var parsedDoc=htmlParser.Parse(html);
var body=parsedDoc.body;
var elements=getAllegements(parsedDoc.Body);
对于(var i=0;i
谢谢,这很有帮助。处理属性文本并将其设置回其所属的原始标记的任何方法。我想用这个翻译一个静态网站。为什么不创建一个新的Html,并在那里添加所有的更改,而不是试图操纵原始页面源代码?最后,只需使用新生成的html。如果AngleSharp没有在GetAllegements中捕捉到这一点,可能会有删除正文中的css、样式、注释等的风险。我将在新html中插入什么?或者它赢了;不要忽视任何事情?有没有使用我的示例HTML构建HTML的示例?
class Program
{
    static void Main(string[] args)
    {

        var response = getHtml("http://www.bbc.com");
        var html = response.Result;

        HtmlParser htmlParser = new HtmlParser();
        var parsedDoc = htmlParser.Parse(html);
        var body = parsedDoc.Body;
        var elements = getAllElements(parsedDoc.Body);

        for(var i = 0; i < elements.Count; i++)
        {
            var child = elements[i];
            child.SetAttribute("data-id", $"data-id{i + 1}");
        }

        File.WriteAllText("E:/soQuestion.txt", parsedDoc.Body.InnerHtml);
    }

    static async Task<string> getHtml(string url)
    {
        using (var httpClient = new HttpClient())
        {
            var response = await httpClient.GetAsync(url);

            //if http request did not succeeed, return empty html
            if (!response.IsSuccessStatusCode) return string.Empty;

            var content = await response.Content.ReadAsStringAsync();
            return content;
        }

    }

    static List<IElement> getAllElements(IElement element)
    {
        List<IElement> elements = new List<IElement>();

        //add element itself
        elements.Add(element);

        foreach (var child in element.Children)
        {
            //add each child elements
            elements.AddRange(getAllElements(child));
        }

        return elements;
    }
}