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