【问题标题】:C# HTML scraping between tags标签之间的 C# HTML 抓取
【发布时间】:2015-07-11 09:09:16
【问题描述】:

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

 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”标签之间的文本。

我该怎么做?

【问题讨论】:

  • 你真正尝试过什么样的东西?使用 HtmlAgilityPack 或 CsQuery 这将非常简单(但远离正则表达式!)
  • 我不认为这是获得意义的正确方法..因为我们不能 100% 确定类名不会被城市词典更改。如果将来城市词典团队改变结构或类名突然改变,那么你将无法获得意义。你将不得不一次又一次地更改代码。
  • 是的,我知道这一点,但“意义”似乎是他们会坚持的东西,但即使他们改变它,我以后也可以改变我的代码,这只是为了测试目的:)
  • 嗨,您能接受我在下面的回答以结束这个问题吗,谢谢

标签: c#


【解决方案1】:

【讨论】:

  • 我会删除关于使用正则表达式的建议,因为正则表达式用于解析正则文本。 HTML 不是常规文本。 HTML Agility Pack 是实现 100% 的正确方法。
【解决方案2】:

我可以建议,在 final_response 字符串中首先找到然后添加从 那个索引+"div class='meaning'".length 到字符串末尾的子字符串。在该子字符串中找到“”的索引位置并再次使用它来查找另一个在 div 标签之间具有文本的子字符串。

示例。 如果您到达索引 100,则使用 100+38 创建子字符串以结束。 这个子字符串会喜欢 "meaning" 。 再次找到让我们假设它是 10 的索引位置,然后找到从 0 到 (10 -1) 的子字符串,这将给出输出为 meaning

【讨论】:

    【解决方案3】:

    也许不是您要找的答案。但是我使用https://www.mashape.com 来获取城市词典的API。不幸的是,它是非官方的,所以我不知道这会持续多久。但正如 cmets 已经提到的那样,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));
    

    【讨论】:

      【解决方案4】:

      有两种选择。

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

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

      你可以在regexstorm.net/tester找到上面测试过的解决方案

      2) 您可以使用 HTMLAgilityPack 。建议使用此方法,但需要您花费一些精力进行设置。使用 Nuget,这并不难。

      HtmlDocument doc = new HtmlDocument();
      doc.LoadHtml(final_response);
      final_response = doc.InnerText;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-03
        • 1970-01-01
        • 1970-01-01
        • 2012-06-26
        • 2016-11-12
        相关资源
        最近更新 更多