Нет ошибок еще ничего в консоли? - PullRequest
0 голосов
/ 22 января 2020

Просто после некоторой помощи с кодом, который я написал для извлечения данных, используя 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)
                {

                }
            }
        }
    }
}

Ответы [ 3 ]

0 голосов
/ 22 января 2020

Я использовал ваш код для поиска значений, но он также ничего не дал для меня. Когда я смотрю на htmlDocument.DocumentNode.OuterHtml, чтобы просмотреть весь Html, который он очищает, я не вижу в документе ничего, что отражает атрибут forecast-table.

Кроме того, вы проверяете MyTable каждый раз, когда вы oop через ряды. Вы должны проверить 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)
        {
        }
    }

Проблема в

Вы также должны знать, что Html вы просматриваете, используя Dev Tools на chrome отличается от того, который вы видите в HtmlAgilityPack. Chrome отображает страницу после выполнения сценариев, где HtmlAgilityPack просто предоставляет вам HTML страницы по умолчанию. По этой причине вы не можете получить значение таблицы прогнозов.

0 голосов
/ 24 января 2020

Спасибо всем за вклад. Очень признателен.

Я вижу во внешнем тексте содержимое таблицы прогнозов.

Мне нужна помощь в разборе, чтобы получить данные для даты и вероятности дождя. Всякий раз, когда я пытаюсь включить это в foreeach, чтобы получить td | th, он не работает


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)
                        foreach (var row in rows.SelectNodes("td"))

0 голосов
/ 22 января 2020

С Do c, для GetAttributeValue(name,def) будет возвращено значение 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());
...