控制台中没有错误但什么也没有?
No Errors yet nothing in Console?
在一些代码的帮助下,我编写了使用 HttpClient
.
提取数据的代码
我是编写代码的新手,所以找不到我的问题。有人可以帮我解决这个问题吗?
我希望将 table 我正在 抓取 的数据写入控制台行。
感谢任何帮助
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using HtmlAgilityPack;
namespace weatherCheck
{
class Program
{
private static void Main(string[] args)
{
GetHtmlAsync();
Console.ReadLine();
}
protected static async void GetHtmlAsync()
{
var url = "https://www.weatherzone.com.au/vic/melbourne/melbourne";
var httpClient = new HttpClient();
var html = await httpClient.GetStringAsync(url);
var htmlDocument = new HtmlDocument();
htmlDocument.LoadHtml(html);
//grab the rain chance, rain in mm and date
var MyTable = Enumerable.FirstOrDefault(htmlDocument.DocumentNode.Descendants("table")
.Where(table => table.Attributes.Contains("id"))
, table => table.Attributes["id"].Value == "forecast-table");
List<HtmlNode> rows = htmlDocument.DocumentNode.SelectNodes("//tr").ToList();
foreach (var row in rows)
{
try
{
if (MyTable != null)
{
Console.WriteLine(MyTable.GetAttributeValue("forecast-table", " "));
}
}
catch (Exception)
{
}
}
}
}
}
来自 Doc,对于 GetAttributeValue(name,def)
,如果找不到属性,它将 return def。
因此,它将打印“”(如果在您的案例中找不到该属性,则为空字符串)
删除 async
和 await
因为你已经调用了 httpClient.GetStringAsync(url);
var html =httpClient.GetStringAsync(url).Result;
var htmlDocument = new HtmlDocument();
htmlDocument.LoadHtml(html);
并打印,
Console.WriteLine(MyTable.GetAttributeValue("forecast-table","SOME_TEXT_HERE").ToString());
我使用您的代码查找值,但它也没有为我产生任何结果。当我查看 htmlDocument.DocumentNode.OuterHtml
以查看整个 Html 它正在抓取时,我在文档中看不到任何反映属性 forecast-table
.
的内容
此外,您每次循环遍历行时都在验证 MyTable。您应该验证 row != null
以及来自 row
.
的打印属性
var MyTable = Enumerable.FirstOrDefault(htmlDocument.DocumentNode.Descendants("table")
.Where(table => table.Attributes.Contains("id")), table => table.Attributes["id"].Value == "forecast-table");
List<HtmlNode> rows = htmlDocument.DocumentNode.SelectNodes("//tr").ToList();
foreach (var row in rows)
{
try
{
if (row != null) // Here, it should be row, not My Table along with MyTable in line below.
Console.WriteLine(row.GetAttributeValue("forecast-table", " "));
}
catch (Exception)
{
}
}
问题是
您还应该知道,您在 chrome 上使用开发工具查看的 Html 与您在 HtmlAgilityPack 中看到的不一样。 Chrome 在执行脚本后呈现页面,其中 HtmlAgilityPack 只是为您提供页面的默认 HTML。这就是您无法获得 forecast-table.
值的原因
在一些代码的帮助下,我编写了使用 HttpClient
.
我是编写代码的新手,所以找不到我的问题。有人可以帮我解决这个问题吗?
我希望将 table 我正在 抓取 的数据写入控制台行。
感谢任何帮助
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using HtmlAgilityPack;
namespace weatherCheck
{
class Program
{
private static void Main(string[] args)
{
GetHtmlAsync();
Console.ReadLine();
}
protected static async void GetHtmlAsync()
{
var url = "https://www.weatherzone.com.au/vic/melbourne/melbourne";
var httpClient = new HttpClient();
var html = await httpClient.GetStringAsync(url);
var htmlDocument = new HtmlDocument();
htmlDocument.LoadHtml(html);
//grab the rain chance, rain in mm and date
var MyTable = Enumerable.FirstOrDefault(htmlDocument.DocumentNode.Descendants("table")
.Where(table => table.Attributes.Contains("id"))
, table => table.Attributes["id"].Value == "forecast-table");
List<HtmlNode> rows = htmlDocument.DocumentNode.SelectNodes("//tr").ToList();
foreach (var row in rows)
{
try
{
if (MyTable != null)
{
Console.WriteLine(MyTable.GetAttributeValue("forecast-table", " "));
}
}
catch (Exception)
{
}
}
}
}
}
来自 Doc,对于 GetAttributeValue(name,def)
,如果找不到属性,它将 return def。
因此,它将打印“”(如果在您的案例中找不到该属性,则为空字符串)
删除 async
和 await
因为你已经调用了 httpClient.GetStringAsync(url);
var html =httpClient.GetStringAsync(url).Result;
var htmlDocument = new HtmlDocument();
htmlDocument.LoadHtml(html);
并打印,
Console.WriteLine(MyTable.GetAttributeValue("forecast-table","SOME_TEXT_HERE").ToString());
我使用您的代码查找值,但它也没有为我产生任何结果。当我查看 htmlDocument.DocumentNode.OuterHtml
以查看整个 Html 它正在抓取时,我在文档中看不到任何反映属性 forecast-table
.
此外,您每次循环遍历行时都在验证 MyTable。您应该验证 row != null
以及来自 row
.
var MyTable = Enumerable.FirstOrDefault(htmlDocument.DocumentNode.Descendants("table")
.Where(table => table.Attributes.Contains("id")), table => table.Attributes["id"].Value == "forecast-table");
List<HtmlNode> rows = htmlDocument.DocumentNode.SelectNodes("//tr").ToList();
foreach (var row in rows)
{
try
{
if (row != null) // Here, it should be row, not My Table along with MyTable in line below.
Console.WriteLine(row.GetAttributeValue("forecast-table", " "));
}
catch (Exception)
{
}
}
问题是
您还应该知道,您在 chrome 上使用开发工具查看的 Html 与您在 HtmlAgilityPack 中看到的不一样。 Chrome 在执行脚本后呈现页面,其中 HtmlAgilityPack 只是为您提供页面的默认 HTML。这就是您无法获得 forecast-table.
值的原因