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 已回答
我在解析网站数据时遇到问题。 下载 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 已回答