C# 控制台中还没有错误吗?

C# 控制台中还没有错误吗?,c#,web-scraping,html-agility-pack,C#,Web Scraping,Html Agility Pack,在我使用HttpClient编写了一些代码来提取数据,并提供了一些帮助之后 我刚开始写代码,所以找不到我的问题。有人能帮我解决这个问题吗 我希望将我正在刮取的表的数据写入控制台行 感谢您的帮助 using System; using System.Collections.Generic; using System.Linq; using System.Net.Http; using HtmlAgilityPack; namespace weatherCheck { class Prog

在我使用
HttpClient
编写了一些代码来提取数据,并提供了一些帮助之后

我刚开始写代码,所以找不到我的问题。有人能帮我解决这个问题吗

我希望将我正在刮取的表的数据写入控制台行

感谢您的帮助

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

                }
            }
        }
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用System.Net.Http;
使用HtmlAgilityPack;
命名空间天气检查
{
班级计划
{
私有静态void Main(字符串[]args)
{
GetHtmlAsync();
Console.ReadLine();
}
受保护的静态异步void GetHtmlAsync()
{
变量url=”https://www.weatherzone.com.au/vic/melbourne/melbourne";
var httpClient=新的httpClient();
var html=await httpClient.GetStringAsync(url);
var htmlDocument=新的htmlDocument();
htmlDocument.LoadHtml(html);
//抓住下雨的机会,下雨在mm和日期
var MyTable=Enumerable.FirstOrDefault(htmlDocument.DocumentNode.Subjections(“表”)
.Where(table=>table.Attributes.Contains(“id”))
,table=>table.Attributes[“id”]。Value==“预测表”);
List rows=htmlDocument.DocumentNode.SelectNodes(“//tr”).ToList();
foreach(行中的变量行)
{
尝试
{
如果(MyTable!=null)
{
Console.WriteLine(MyTable.GetAttributeValue(“预测表”);
}
}
捕获(例外)
{
}
}
}
}
}
From,对于
GetAttributeValue(name,def)
如果找不到属性,它将返回def

因此,它将打印“”(如果在您的案例中找不到该属性,则为空字符串)

删除
async
wait
,因为您已经在调用
httpClient.GetStringAsync(url)

和打印

 Console.WriteLine(MyTable.GetAttributeValue("forecast-table","SOME_TEXT_HERE").ToString());

我使用您的代码查找值,但它也没有为我生成任何内容。当我查看
htmlDocument.DocumentNode.OuterHtml
以查看它正在删除的整个Html时,我在文档中没有看到任何反映属性
预测表的内容

此外,每次循环行时都要验证MyTable。您应该验证
行!=空值
以及行
中的打印属性

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)
        {
        }
    }
var MyTable=Enumerable.FirstOrDefault(htmlDocument.DocumentNode.Subjections(“表”)
其中(table=>table.Attributes.Contains(“id”)),table=>table.Attributes[“id”]。Value==“预测表”);
List rows=htmlDocument.DocumentNode.SelectNodes(“//tr”).ToList();
foreach(行中的变量行)
{
尝试
{
如果(row!=null)//在这里,它应该是row,而不是我的表以及下面一行中的MyTable。
WriteLine(row.GetAttributeValue(“预测表”);
}
捕获(例外)
{
}
}
问题是


您还应该知道,在chrome上使用开发工具查看的Html与在HtmlAlityPack中看到的Html不同。Chrome在执行脚本后呈现页面,其中HtmlAgilityPack仅为您提供页面的默认HTML。这就是您无法获取forecast table值的原因。

您是否尝试过调试应用程序?例如,`var MyTable=Enumerable.FirstOrDefault`行实际返回什么,您知道吗?另外,如果您不想返回任何返回任务的内容,那么您应该让异步方法返回false,以便等待它们,您如何知道没有异常?您的
catch
块为空,因此您忽略了可能发生的任何事情!非常感谢。当我签出文本时,我在outerHtml中看到forecast tablw的id。一个警告:当没有找到任何内容时,SelectNodes返回null而不是空列表
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)
        {
        }
    }