Hallo, kennt einer einen guten HTML Parser? Möchte ein gutes altes Win32 Projekt, dass ich erweitern soll, gleich mal technologisch anpassen. Mir fehlt eben nur ein guter HTML Parser für .NET zu meinem Glück.
Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the Universe trying to produce bigger and better idiots. So far, the Universe is winning.
"Gut" ist ja immer relativ betrachtet, n'est pas? 😉.
Ich verwende den SgmlReader in einigen Projekten zu meiner vollsten Zufriedenheit.
Hm. Eine Ereignissausgabe wenn ein Tag oder Text gefunden wird brauch ich schon. Elementlisten nützen mir da nichts, z.B. (Delphi):
procedure OnText(Sender: TObject; Token: String);
procedure OnTag(Sender: TObject; HtmlTag: String; Attributes: TStringList);
Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the Universe trying to produce bigger and better idiots. So far, the Universe is winning.
Tjaja, die verwöhnte Delphi-Jugend 😉.
Mir wäre das relativ wurscht, ob ich jetzt ein Ereignis bekomme oder einfach selbst SgmlReader.MoveToNextAttribute() aufrufe.
Oh danke für "Jugend" (bin 37). So genau hatte ich das Teil noch nicht betrachtet. 😉
Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the Universe trying to produce bigger and better idiots. So far, the Universe is winning.
Original von Uwe Keim
Tjaja, die verwöhnte Delphi-Jugend 😉.Mir wäre das relativ wurscht, ob ich jetzt ein Ereignis bekomme oder einfach selbst SgmlReader.MoveToNextAttribute() aufrufe.
Gibt es dafür auch eine vernüftige Demo? Ich will doch nur parsen! 🙁
Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the Universe trying to produce bigger and better idiots. So far, the Universe is winning.
Ich mache das so:
private XmlReader GetDocReader(
string html,
string baseUrl )
{
SgmlReader r = new SgmlReader();
if ( baseUrl.Length>0 )
{
r.SetBaseUri( baseUrl );
}
r.DocType = "HTML";
r.InputStream = new StringReader( html );
return r;
}
Und dann so:
/// <summary>
/// Find all links.
/// </summary>
/// <param name="xml"></param>
/// <returns></returns>
private string[] FindAllLinks(
XmlReader xml )
{
ArrayList links = new ArrayList();
while ( xml.Read() )
{
switch ( xml.NodeType )
{
// A node element.
case XmlNodeType.Element:
string[] linkAttributeNames;
// If this is a link element, store the URLs to modify.
if ( IsLinkElement( xml.Name, out linkAttributeNames ) )
{
while ( xml.MoveToNextAttribute() )
{
foreach ( string a in linkAttributeNames )
{
if ( a.ToLower()==xml.Name.ToLower() )
{
string linkUrl = xml.Value;
if ( !IsAbsoluteUrl( linkUrl ) )
{
links.Add( linkUrl );
}
}
}
}
}
break;
}
}
return (string[])links.ToArray( typeof(string) );
}
OK, vielleicht etwas kontextlos aber so verwende ich das 😉. Ich denke aber es sind auch beim Original Beispiele dabei.