【问题标题】:C# Html Agility Pack Parsing Data From WebsiteC# Html Agility Pack 从网站解析数据
【发布时间】:2020-05-13 09:07:15
【问题描述】:

我在解析网站数据时遇到问题。 下载 html 并加载它时,html 文档变为空。我也无法解析表中的任何数据,因为没有或在 html 文档中。行和列部分在表中,但它为空..

有人帮忙吗? 谢谢.. 这是我使用的代码;

Uri uri =new Uri("https://deprem.afad.gov.tr/sondepremler.html");
HttpWebRequest webClient = (HttpWebRequest)WebRequest.Create(uri);
webClient.Method = "GET";
webClient.ContentType = "text/html;charset=utf-8";
HtmlDocument doc = new HtmlDocument();

            using (var response = (HttpWebResponse)webClient.GetResponse())
            {
                using (var stream = response.GetResponseStream())
                {
                    doc.Load(stream, Encoding.GetEncoding("utf-8"));
                }
            }
            var tds = doc.DocumentNode.SelectNodes("//table//tr//td");

这是从网站转过来的html文件;

<table id="resultTable" class="table table-striped" cellspacing="0" width="100%">
    <thead>
        <tr>
            <th></th>
            <th id="thDate">Tarih(TS)</th>
            <th>Ajans</th>
            <th>Enlem</th>
            <th>Boylam</th>
            <th>Derinlik</th>
            <!--<th>Rms</th> -->
            <th>Tip</th>
            <th>Büyüklük</th>
            <th>Ülke</th>
            <th>İl</th>
            <th>İlçe</th>
            <th>Köy</th>
            <th>Diğer</th>
            <th>EventID</th>
        </tr>
    </thead>
    <tbody id="tbody">
    </tbody>
</table>

【问题讨论】:

  • 我在你的 html 中没有看到任何 td 节点。

标签: c# html html-agility-pack


【解决方案1】:

当您访问一个站点时,您可以按 F12 并查看所有正在拨打的电话。您可以使用这些 API 调用来自己使用 Postman 或使用 Rest 客户端通过 C# 检索数据。

这是一个如何获取所需数据的示例。我使用 chrome 上的开发工具查看了在网络选项卡下进行的调用。

    public class Event
    {
        public string eventId { get; set; }
        public string time { get; set; }
        public string agency { get; set; }
        public string lat { get; set; }
        public string lon { get; set; }
        public string depth { get; set; }
        public string rms { get; set; }
        public string type { get; set; }
        public string m { get; set; }
        public object place { get; set; }
        public string country { get; set; }
        public string city { get; set; }
        public string district { get; set; }
        public string town { get; set; }
        public string other { get; set; }
        public object mapImagePath { get; set; }
        public object strike1 { get; set; }
        public object dip1 { get; set; }
        public object rake1 { get; set; }
        public object strike2 { get; set; }
        public object dip2 { get; set; }
        public object rake2 { get; set; }
        public object ftype { get; set; }
        public object pic { get; set; }
        public object file { get; set; }
        public object focalId { get; set; }
        public string time2 { get; set; }
    }

您可以在主程序中使用上述类,例如,

    var client = new RestClient("https://deprem.afad.gov.tr/latestCatalogsList");
    client.Timeout = -1;
    var request = new RestRequest(Method.POST);
    request.AddHeader("Content-Type", "multipart/form-data");
    request.AlwaysMultipartFormData = true;
    request.AddParameter("m", "0");
    request.AddParameter("utc", "0");
    request.AddParameter("lastDay", "1");
    var response = client.Execute<List<Event>>(request);

    List<Event> myData = response.Data;
    Console.WriteLine(response.Content);

您将拥有一个包含网站所有数据的对象。您可以对这些数据做任何您需要做的事情。

如果有帮助,请务必将帖子标记为已回答

【讨论】:

  • 嘿,抱歉迟到了.. 我试过了,所以效果很清楚:) 但是你是如何在 chrome 的“网络”选项卡中找到它的,我正在寻找它,但我找不到它,我怎么能在其他类似的应用程序中做这个解决方案吗?
【解决方案2】:

很遗憾,您尝试访问的数据将无法从 HtmlAgilityPack 访问。

为什么不能访问在 Chrome 中打开(并使用 DevTools)时清晰可见的 Html-Agility-Pack 中的数据?

那是因为数据是由 chrome 或您使用的其他浏览器呈现的。 Html-Agility-Pack 不处理浏览器能够执行的脚本和其他执行。您可以访问静态数据(例如表的 TH / 表头),但不能访问最有可能来自数据库的自动生成的行数据。

如果你查看你得到的文档的 InnerHtml,有一个脚本需要执行。

            success: function(data)
            {
                $('#resultTable').DataTable().destroy();
                $('#resultTable tbody').empty();

                var locations = [];

                var i;
                for (i = 0; data.length > i; ++i) {

                    var lat = parseFloat(data[i].lat);
                    var lon = parseFloat(data[i].lon);
                    //var location = new google.maps.LatLng(lat, lon);
                    var location = convertGoogleMapCordsToOpenLayerCords(lat, lon);
              ...

这是实际生成包含您尝试获取的数据的表/tbody 的脚本。

您最好寻找网站可能提供的 API 以直接获取详细信息。

【讨论】:

  • HAP 最初只是一个 Html 解析器,但后来的版本增加了在后台运行浏览器的功能,因此您可以从那里抓取动态内容
  • 我不相信单独的 HAP 可以通过脚本执行来渲染页面。如果你有一些例子,我不介意从中学习一些东西:)
  • 我没有尝试刮掉OP提到的页面,但是你可以查看官方网站的代码示例html-agility-pack.net/from-browser,查看LoadFromBrowser方法。
  • @derloopkat 我编写了使用线程和 LoadFromBrowser 读取文档的过程,td 标签仍然没有显示。同样,如果您有机会添加答案,那就太好了。
猜你喜欢
  • 2014-09-11
  • 1970-01-01
  • 2011-01-16
  • 1970-01-01
  • 2011-06-12
  • 1970-01-01
  • 1970-01-01
  • 2011-06-04
  • 2014-07-13
相关资源
最近更新 更多