【问题标题】:How to extract data from webpage using C#如何使用C#从网页中提取数据
【发布时间】:2017-04-09 14:04:21
【问题描述】:

我正在尝试从此 HTML 标记中提取文本

<span id="example1">sometext</span>

我有这个代码:

using System;
using System.Net;
using HtmlAgilityPack;

namespace GC_data_console
{
    class Program
    {
        public static void Main(string[] args)
        {           
            using (var client = new WebClient())
            {
                // Download the HTML
                string html =
                    client.DownloadString("https://www.requestedwebsite.com");
                HtmlDocument doc = new HtmlDocument();
                doc.LoadHtml(html);
                foreach(HtmlNode link in
                        doc.DocumentNode.SelectNodes("//span"))
                {
                    HtmlAttribute href = link.Attributes["id='example1'"];
                    if (href != null)
                    {
                        Console.WriteLine(href.Value.ToString());
                        Console.ReadLine();
                    }
                }
            }
        }
    }
}

但我仍然没有收到 sometext 的文字。 但如果我插入:

HtmlAttribute href = link.Attributes["id"];

我会得到所有的 ID 名称。我做错了什么?

【问题讨论】:

  • 您能否分享您尝试获取内容的实际 URL?此外,您正在尝试获取 HtmlAttribute 的值而不是元素。你需要尝试得到的是link.InnerText
  • 你好,例如从这个网页geocaching.com/geocache/GC257YR_slivercup-studios-east,我正在尝试从标签中获取文本:SliverCup Studios East
  • 知道了.... 你试过我建议的其他方法了吗?您是否还调试并检查您是否获得了正确的元素?
  • 我试过了,HtmlAttribute href = link.InnerText["id='ctl00_ContentBody_CacheName'"];但它没有用,我得到参数 1:无法将类型 'int' 隐式转换为 'string' (CS1503) 错误

标签: c# html text


【解决方案1】:

您需要先了解 HTML Node 和 HTMLAttribute 之间的区别。您的代码远不能解决问题。

HTMLNode 表示 HTML 中使用的标签,例如 span,div,p,a 等等。 HTMLAttribute 表示用于 HTMLNode 的属性,例如href 属性用于astyleclassidname 等属性几乎用于所有 HTML 标签。

在 HTML 下面

<span id="firstName" style="color:#232323">Some Firstname</span>

span 是 HTMLNode 而idstyle 是 HTMLAttributes。并且您可以使用 HtmlNode.InnerText 属性获取值Some FirstName

从 HtmlDocument 中选择 HTMLNodes 也不是那么简单。您需要提供适当的 XPath 来选择所需的节点。

现在在您的代码中,如果您想获取用&lt;span id="ctl00_ContentBody_CacheName"&gt;SliverCup Studios East&lt;/span&gt; 编写的文本,它是someurl.com 的HTML 的一部分,您需要编写以下代码。

using (var client = new WebClient())
{
    string html = client.DownloadString("https://www.someurl.com");

    HtmlDocument doc = new HtmlDocument();
    doc.LoadHtml(html);

   //Selecting all the nodes with tagname `span` having "id=ctl00_ContentBody_CacheName".
    var nodes = doc.DocumentNode.SelectNodes("//span")
        .Where(d => d.Attributes.Contains("id"))
        .Where(d => d.Attributes["id"].Value == "ctl00_ContentBody_CacheName");

    foreach (HtmlNode node in nodes)
    {
        Console.WriteLine(node.InnerText);
    }
}

上面的代码将选择所有位于 HTML 文档节点下的 span 标签。位于层次结构深处的标记需要使用不同的 XPath。

这应该可以帮助您解决问题。

【讨论】:

  • 谢谢!这解决了我的问题,也感谢您的解释。自从我在 html 中创建了一些东西以来,这是很久以前的事了。现在我通过 WebClient 以某种方式“登录”,因此我可以存储仅提供给登录用户的数据,但我将在未来这样做。
猜你喜欢
  • 1970-01-01
  • 2022-06-16
  • 2016-01-25
  • 2023-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-08
相关资源
最近更新 更多