如何从HTML页面中提取一个单词或一些单词C#

问题描述 投票:1回答:2

在这里,我试图从HTML页面中提取一个单词。例如,有两个文本框(1和2)。现在我试图在textbox1上给出stackoverflow问题ID并在textbox2上获得“ask”值。例如,如果我在textbox1上给出36,那么应该在textbox2上给我“9年,4个月前”。 WebClient webpage = new WebClient(); String html = webpage.DownloadString("https://stackoverflow.com/questions/" + textBox1.Text); MatchCollection match = Regex.Matches(html, FILTERHERE, RegexOptions.Singleline); 问题是我不知道如何过滤我的输出(FILTERHERE)?另外我如何将输出发送到textbox2?

c# html winforms webclient
2个回答
2
投票

随着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;

如果您不了解XPath,Chrome和Firefox的浏览器扩展程序会为您获取任何Html标记的XPath(我个人手动编写它们以使它们对页面结构的更改不太敏感)。


2
投票

使用Windows Forms applicationWebBrowser控件可以使用whpps mshtml库并公开托管的HTML DOM。检索asked文本的函数示例:

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";
}

可以从我的Dropbox下载带有Windows窗体应用程序的Complete example

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.