8
votes

Comment nettoyer le HTML mal formé à l'aide de HTML Agility Pack

Je tente de remplacer cette guidique collection d'expressions régulières actuellement utilisées pour nettoyer les blocs de HTML mal formé et trébubli sur le pack d'agilité HTML pour C #. Il a l'air très puissant mais pourtant, je n'ai pas pu trouver un exemple de la façon dont je veux utiliser le peloton qui, dans mon esprit, serait une fonctionnalité souhaitée incluse. Je suis sûr que je suis un idiot et je ne trouve pas une méthode appropriée dans la documentation.

Permettez-moi d'expliquer ... Dites que j'avais le suivant HTML: P>

<p>
    this is some text
    <a href="somepage.html">Some link</a>
</p>


0 commentaires

3 Réponses :


-1
votes

Une fois que vous avez trouvé que l'élément

utilise la méthode Innertext pour obtenir le texte, puis effectuez la suppression, puis insérez le texte.


1 commentaires

Désolé, je suppose que mes exemples HTML étaient trop simplistes. Il doit copier plus que l'Innertext vers l'élément parent. S'il vous plaît voir mes exemples révisés / édités.



7
votes

sur htmlnode, la méthode Removechild a cette surcharge: xxx pré>

Voici comment vous le feriez: P>

public static HtmlNode RemoveChild(HtmlNode parent, HtmlNode oldChild, bool keepGrandChildren)
{
    if (oldChild == null)
        throw new ArgumentNullException("oldChild");

    if (oldChild.HasChildNodes && keepGrandChildren)
    {
        HtmlNode prev = oldChild.PreviousSibling;
        List<HtmlNode> nodes = new List<HtmlNode>(oldChild.ChildNodes.Cast<HtmlNode>());
        nodes.Sort(new StreamPositionComparer());
        foreach (HtmlNode grandchild in nodes)
        {
            parent.InsertAfter(grandchild, prev);
        }
    }
    parent.RemoveChild(oldChild);
    return oldChild;
}

// this helper class allows to sort nodes using their position in the file.
private class StreamPositionComparer : IComparer<HtmlNode>
{
    int IComparer<HtmlNode>.Compare(HtmlNode x, HtmlNode y)
    {
        return y.StreamPosition.CompareTo(x.StreamPosition);
    }
}


4 commentaires

Cela semble prometteur avec un problème. Il inverse l'ordre des petits-enfants de l'original.


@nokturnal - bonne prise! hhmmm. On dirait un bug pour moi. J'ai mis à jour ma réponse.


Cela ressemble à la bonne réponse, mais il y a des défauts dans le pack d'agilité HTML avec qui m'éloignera probablement pour ce projet.


La première solution (avant que le edit ) semble fonctionner correctement pour moi.



2
votes

Vous pouvez essayer d'utiliser anglesharp à la place.

var parser = new HtmlParser();
var document = parser.Parse(html);

using (var writer = new StringWriter())
{
    document.ToHtml(writer, new PrettyMarkupFormatter());
    return writer.ToString();
}


2 commentaires

Totalement une libération étonnante (de même que c'est pseudo-prédécesseur Csquery), et je recommanderais totalement ceci maintenant ... cela n'existait tout simplement pas en 2011 :)


Actuellement, au lieu de parser.parse , vous devez utiliser parser.parseDocument .