HtmlAgilityPack Проблема при чтении некоторых сайтов - PullRequest
0 голосов
/ 29 мая 2020

У меня проблема с чтением некоторых сайтов, использующих HtmlAgilityPack. например https://faranesh.com и https://cbi.ir

Проблема: urlResponse return = "\ r \ n \ r \ n \ r \ n

Я пробовал этот код, но он возвращает только нулевые значения. Я хочу получить доступ к коду сайта, но не могу мне помочь.

C# код чтения:

    {
        var url = @"https://www.cbi.ir/";

        HtmlWeb web = new HtmlWeb();

        var Doc = web.Load(url);

        var node = Doc.DocumentNode.SelectSingleNode("//title");

        Console.WriteLine($"Title is {node.InnerText}");
    }

1 Ответ

1 голос
/ 29 мая 2020

Похоже, что отправляемые вами примеры относятся к одностраничным приложениям или основаны на JavaScript. Первый пример возвращает следующее HTML:

<!DOCTYPE html>
<html lang="fa-IR">
<head>
<script type="9055e798d34ceda9b8089665-text/javascript">(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
            new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
        j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
        'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
    })(window,document,'script','dataLayer','GTM-MSQZK3S');</script>
<script type="9055e798d34ceda9b8089665-text/javascript">
        !function (t, e, n) {
            t.yektanetAnalyticsObject = n, t[n] = t[n] || function () {
                t[n].q.push(arguments)
            }, t[n].q = t[n].q || [];
            var a = new Date, r = a.getFullYear().toString() + "0" + a.getMonth() + "0" + a.getDate() + "0" + a.getHours(),
                    c = e.getElementsByTagName("script")[0], s = e.createElement("script");
            s.id = "ua-script-yn-2448-adv"; s.dataset.analyticsobject = n;
            s.async = 1; s.type = "text/javascript";
            s.src = "https://cdn.yektanet.com/rg_woebegone/scripts_v2/yn-2448-adv/rg.complete.js?v=" + r, c.parentNode.insertBefore(s, c)
        }(window, document, "yektanet");
    </script>
<base href="/">
<meta charset="UTF-8">
<meta name="theme-color" content="#2e9ed8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="language" content="fa" />
<link rel="apple-touch-icon" sizes="180x180" href="./apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="32x32" href="./favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="./favicon-16x16.png">
<link rel="manifest" href="./site.webmanifest">
<link rel="mask-icon" href="./safari-pinned-tab.svg" color="#5bbad5">
<meta name="msapplication-TileColor" content="#ffc40d">
<meta name="theme-color" content="#ffffff">
<meta name="google-signin-scope" content="profile email">
<link rel="search" type="application/opensearchdescription+xml" title="Faranesh" href="./opensearch.xml" />
<link rel="manifest" href="./manifest.json" />

Как видите, изначально нет ни тела, ни тега заголовка.

Если вы хотите проанализировать содержимое, включая JavaScript сгенерированных элементов DOM, которые вам понадобятся для автоматизации браузера Headless вместо анализа необработанных HTML, возвращаемых сервером.

Например, попробуйте:

Не тестировалось локально, но из примеров в их репозитории, что-то вроде эти строки:

await new BrowserFetcher().DownloadAsync(BrowserFetcher.DefaultRevision);
var browser = await Puppeteer.LaunchAsync(new LaunchOptions
{
    Headless = true
});
var page = await browser.NewPageAsync();
await page.GoToAsync("https://faranesh.com/");

var title = @"document.title";
Console.WriteLine($"Title: {title}");
...