AngleSharp, чтобы получить все теги HTML и назначить уникальный атрибут id

Есть ли способ использовать AngleSharp, чтобы подсчитать все теги тела, а затем назначить уникальный идентификатор атрибута например, «data-id=1», «data-id=2» и т. д. для всех тегов.

Я хочу проверить это для перевода статического веб-сайта. Затем я буду использовать селектор запросов [data-id] и возьму TextContent из каждого тега, переведу текст с помощью API перевода и верну переведенный текст в идентификатор тега, где это было извлечено из первоначально.

С#

var html = File.ReadAllText(@"C:\example.html");
    var parser = new HtmlParser();
    var document = parser.Parse(html);

    var elements = document.All.Where(o => o.NodeType == AngleSharp.Dom.NodeType.Text && o.TextContent.Trim() != ""); // If text, assign id.
    if(elements != null)
    {
        int number = 0;
        foreach(var element in elements)
        {
            element.SetAttribute("data-id", number.ToString());
            number++;

            element.OuterHtml.Dump();
        }
    }

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>

person Priyanka Rathee    schedule 19.06.2018    source источник


Ответы (1)


Похоже, это делает следующее. По сути, он собирает все нисходящие элементы из элемента Body, перебирает их и добавляет атрибут. Возможно, у вас возникли проблемы с перебором ВСЕХ потомков.

Я записываю обновленный внутренний HTML-код тела в текстовый файл, чтобы вы видели, что атрибуты «data-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;
    }
}
person Veverke    schedule 26.06.2018
comment
Спасибо, это помогает. Любой способ обработать текст атрибута и вернуть его в исходный тег, которому он принадлежит. Я хочу перевести статический сайт, используя это. - person Priyanka Rathee; 27.06.2018
comment
Почему бы не создать новый HTML-код и не добавить туда все изменения вместо того, чтобы пытаться манипулировать исходным кодом страницы? В конце просто используйте только что сгенерированный html. - person Veverke; 27.06.2018
comment
Может быть риск удаления ‹script›, css, стилей, комментариев и т. д. в теле, если AngleSharp не зафиксировал это в getAllElements, что я собираюсь вставить в свой новый HTML? Или ничего не проигнорирует? Любой пример для создания HTML с использованием моего примера HTML? - person Priyanka Rathee; 28.06.2018