C# Html 敏捷包从网站解析数据

C# Html Agility Pack Parsing Data From Website

我在解析网站数据时遇到问题。 下载 html 并加载后 html 文档变为空。我也无法解析来自 table 的任何数据,因为没有或在 html document.Rows 中,并且列部分在 table 中,但它被取消了..

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

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>

不幸的是,您将无法从 HtmlAgilityPack 访问您尝试获取的数据。

Why can you not access the data in Html-Agility-Pack that is clearly visible when you open in Chrome (and use DevTools)?

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

如果你查看你得到的文档的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);
              ...

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

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

当您访问站点时,您可以按 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; }
    }

您可以在主程序中使用上面的 class,例如,

    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);

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

如果有帮助,请标记 post 已回答