2017-12-16 3 views
1

Hier versuche ich ein Wort aus einer HTML-Seite zu extrahieren. Zum Beispiel gibt es zwei Textfelder (1 und 2). Jetzt versuche ich Stackoverflow Frage ID auf Textbox1 geben und "Frage" Wert auf Textbox2. Zum Beispiel, wenn ich 36 auf textbox1 gebe, sollte dies mir "9 Jahre, 4 Monate" auf textbox2 geben. WebClient webpage = new WebClient(); String html = webpage.DownloadString("https://stackoverflow.com/questions/" + textBox1.Text); MatchCollection match = Regex.Matches(html, FILTERHERE, RegexOptions.Singleline); Das Problem ist, ich weiß nicht, wie ich meine Ausgabe (FILTERHERE) filtern? Wie kann ich meine Ausgabe auch in textbox2 senden?So extrahieren Sie ein Wort oder einige Wörter aus einer HTML-Seite C#

+1

Verwenden von Regex auf HTML ist eine [schlechte Idee] (https://Stackoverflow.com/a/1732454/) –

+0

Können Sie dies mit Ihrer eigenen Methode tun? – Leviathan

+0

Verwenden Sie XPath oder css-Selektoren –

Antwort

2

Mit HtmlAgilityPack.

string url = "https://stackoverflow.com/questions/"; 
var web = new HtmlWeb(); 
var doc = web.Load(url + textBox1.Text); //the text is "36" 
var tag = doc.DocumentNode.SelectSingleNode("//*[@id='qinfo']//td[./p[@class='label-key' and text()='asked']]/following-sibling::td//b"); 
textBox2.Text = tag.InnerText; 

Wenn Sie nicht XPath wissen, gibt es Browser-Erweiterungen für Chrome und Firefox, die für Sie die XPath jedes HTML-Tag bekommt (ich schreibe sie persönlich manuell sie weniger empfindlich auf Veränderungen auf Seitenstruktur zu machen) .

2

Mit Windows Forms-Anwendung WebBrowser Kontrolle kann verwendet werden wthich wpapps die Mshtml-Bibliothek und stellt verwaltet HTML DOM. Beispiel für Funktion, die den asked Text ruft:

private static string GetAskedText(HtmlDocument doc) 
{ 
    if (doc == null) 
     return "document-null"; 
    IEnumerable<mshtml.HTMLDivElement> divs = doc.GetElementsByTagName("div") 
     .OfType<HtmlElement>() 
     .Select(e => e.DomElement as mshtml.HTMLDivElement); 
    foreach (var div in divs) 
    { 
     if (string.IsNullOrWhiteSpace(div?.className)) 
      continue; 
     if (div.className.Trim().ToLower() != "user-info") 
      continue; 
     var spans = div.getElementsByTagName("span").OfType<mshtml.HTMLSpanElement>(); 
     foreach (var span in spans) 
     { 
      if (string.IsNullOrWhiteSpace(span?.className)) 
       continue; 
      if (span.className == "relativetime") 
      { 
       return span.innerText; 
      } 
     } 
    } 

    return "not-found"; 
} 

Complete example mit Windows Forms-Anwendung kann von meiner Dropbox heruntergeladen werden.

enter image description here

+0

Danke, aber es ist eine Konsolenanwendung. Ich fragte nach Windows-Formular-Anwendung. – Leviathan

+0

Windows Forms? Das ist nur ein sehr kleiner Unterschied. Die Funktion 'GetAsked' bleibt gleich. – dee

+0

Ja: P, aber es ist nicht das gleiche btw – Leviathan

Verwandte Themen