【问题标题】:HTMLAgilityPack get class innerTextHTMLAgilityPack 获取类 innerText
【发布时间】:2017-06-17 13:04:31
【问题描述】:

我正在尝试获取课程的innerText。 这是我的代码:

using (HttpClient clientduplicate = new HttpClient())
{
    clientduplicate.DefaultRequestHeaders.Add("User-Agent",
        "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident / 6.0)");

    using (HttpResponseMessage responseduplicate = await clientduplicate.GetAsync(@"https://www.investing.com/news/stock-market-news/warren-buffett:-i-bought-$12-billion-of-stock-after-trump-won-456954")
    using (HttpContent contentduplicate = responseduplicate.Content)
    {
        try
        {
            string resultduplicate = await contentduplicate.ReadAsStringAsync();

            var websiteduplicate = new HtmlDocument();
            websiteduplicate.LoadHtml(resultduplicate);

            var titlesduplicate = websiteduplicate.DocumentNode.Descendants("div").FirstOrDefault(o => o.GetAttributeValue("class", "") == "arial_14 clear WYSIWYG newsPage");
            var match = Regex.Match(titlesduplicate.InnerText, @"(.*?)<!--", RegexOptions.Singleline).Groups[1].Value;

            Debug.WriteLine(match.TrimStart());
        }
        catch(Exception ex1)
        {
            var dialog2 = new MessageDialog(ex1.Message);
            await dialog2.ShowAsync();
        }
    }
}

现在的问题是这也会返回我图片上的文字。我可以找到解决方法,但我想知道是否有其他方法。 更简单/更快的东西。

另外,当我在其他文章/网址上使用它时,还有其他小错误。

【问题讨论】:

  • 您可以使用类似 titlesduplicate.SelectNodes("./img")?.ToList().ForEach(i =&gt; i.Remove()); 的 xpath 查询来清理您的节点,对于选择重复标题,请使用 var titlesduplicate = websiteduplicate.DocumentNode.SelectSingleNode("//div[contains(@class, 'newsPage')]");
  • 你能详细说明错误是什么吗?
  • @GantTheWanderer 字母编码,字母更改为 html。小事。
  • 我会接受洪曹的回答,删除令人反感的材料。否则,您的选择器需要更加准确。你想收集什么信息,你打算用它做什么?
  • 如果我是 Web 服务器,我不会发送换行符,因为它们在 HTML 和许多其他类型的标记中不是必需的。换行符使人类更容易阅读,但它只是浪费了计算机解析的空间,多余的数据通过管道不必要地传输。

标签: c# class http html-agility-pack innertext


【解决方案1】:

有很多方法可以做到这一点。一种方法是在获取 innerText 之前删除轮播 div: doc.DocumentNode.Descendants("div").FirstOrDefault(_ =&gt; _.Id.Equals("imgCarousel"))?.Remove();

【讨论】:

  • 如果imgCarousel 不存在,这将抛出System.NullReferenceException。我修复了它,但编辑了你的答案,所以我可以接受它。
  • 我明白了。我添加了? 来检查空引用。我希望你知道这个 c# 6 语法
  • 我似乎可以解决的一个错误是它没有换行符。所有文本都在一行中。对此有任何想法吗?如果您想帮助进行这些小调试,我会在此处添加此内容
  • 你能描述更多吗?顺便说一句,你有什么理由必须使用正则表达式吗? IMO,我们不应该使用正则表达式来解析 html。
  • 我使用正则表达式的原因是因为我不想要innerText的所有部分。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-05
  • 2012-01-06
  • 1970-01-01
  • 2023-04-02
  • 2017-11-25
  • 2016-06-15
  • 1970-01-01
相关资源
最近更新 更多