C#在标记之间进行HTML抓取

C#在标记之间进行HTML抓取,c#,C#,好的,我正在尝试一个Skype工具,它有一个“dictionary”命令,在我能够将整个HTML文档加载到字符串中时,可以从urban dictionary中检索单词的含义,如下所示: private void urbanDictionary(string term) { HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://www.urbandictionary.com/d

好的,我正在尝试一个Skype工具,它有一个“dictionary”命令,在我能够将整个HTML文档加载到字符串中时,可以从urban dictionary中检索单词的含义,如下所示:

 private void urbanDictionary(string term)
        {
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://www.urbandictionary.com/define.php?term=" + term);
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();

            StreamReader stream = new StreamReader(response.GetResponseStream());
            string final_response = stream.ReadToEnd();

            MessageBox.Show(final_response);
        }
问题是我只想要这样的意思

<div class='meaning'> "meaning" </div>
“意义”
我尝试了各种各样的东西,但我无法检索“div”标记之间的文本


我该怎么做呢?

我可以建议,在最终的响应字符串中,首先查找然后添加一个子字符串,从中创建一个子字符串,该子字符串的索引为+“div class='means'”。长度为字符串的结尾。在该子字符串之后,查找“”的索引位置,并再次使用该子字符串查找另一个子字符串,该子字符串在div标记之间具有文本

例如。 如果您在索引100处得到,那么使用100+38创建子字符串以结束。 此子字符串类似于“含义”。
再次查找lets的索引位置,假设它是10,然后从0到(10-1)查找子字符串,这将给出输出为,意思是

使用HtmlAgilityPack库,这正是您需要的


也许不是你想要的答案。但我以前为《城市词典》买过API。不幸的是,这是非官方的,所以我不知道这会持续多久。但是,正如前面提到的,html也可能总是变化的——很可能比API更频繁。此外,API消耗更少的带宽,这应该是首选

用法将是

var client = new WebClient();
client.Headers.Add("X-Mashape-Key", "APIKEY");
client.Headers.Add("Accept", "text/plain");
Console.WriteLine(client.DownloadString("https://mashape-community-urban-dictionary.p.mashape.com/define?term="+ term));
有两种选择

1) 您可以使用Regex删除HTML标记。这是简短的,如果您处理的HTML源代码不复杂,您可以使用它

string meaningStr = Regex.Replace(final_response, @"<[^>]+>", "").Trim();

可能是你真正尝试过的那种东西的复制品?这对于HtmlAgilityPack或CsQuery来说非常简单(但不要使用正则表达式!)我认为这不是获得意义的正确方法。因为我们不能100%确定urbandictionary不会更改类名。如果将来urbandictionary团队更改了结构或类名突然更改,那么您将无法理解其含义。您将不得不一次又一次地更改代码。是的,我知道这一点,但“含义”似乎是他们会坚持的,但即使他们更改了它,我以后也没有问题更改代码,这只是出于测试目的:)嗨,你能接受我下面的答案吗?要结束这个问题,谢谢。我会删除关于使用正则表达式的建议,因为正则表达式用于解析正则文本。HTML不是常规文本。HTML敏捷包是100%的正确选择。
HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(final_response);
final_response = doc.InnerText;