首页 > 解决方案 > 从使用 iframe c# 的网页中抓取数据

问题描述

我正在尝试从网页 https://www.thpa.gr/index.php/en/services-3/search-ek获取一些数据

基本上你输入一个容器的编号(例如 OOLU0198315)并在容器被卸载时返回以及一些其他信息。我的问题是,据我所知,这是用 iframe(或 javascript)制作的,它不包含网页中的数据作为代码。

例如,如果您搜索 OOLU0198315,它会返回以下数据

<tr bgcolor="#fafafa"> 
<td style="padding:7px">OOLU0198315</td>
<td style="padding:7px">781442-1</td>
<td style="padding:7px">ΦΟΡΤΩΣΗ</td>
<td style="padding:7px">Nov 24 2020 11:04:26:217AM</td>
<td style="padding:7px">Δεν εκδόθηκε τιμολόγιο</td></tr>

其中不包含任何 id 或类来获取基于 Xpath 或基于 id 的数据。

我试图根据上一个问题获取这些数据 如何在 c# 中抓取使用 JavaScript 创建的表

但我无法遵循相同的解决方案。我尝试使用 Selenium 和 HtmlAgilityPack,但没有 Xpath 来获取数据。有没有其他方法可以获取这些信息?

到目前为止我的代码与 HtmlAgilityPack

WebClient webClient = new WebClient();
        string page = webClient.DownloadString("https://www.thpa.gr/index.php/en/services-3/search-ek");

        HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
        doc.LoadHtml(page);

        List<List<string>> table = doc.DocumentNode.SelectSingleNode("/html/body/div/table/tbody/tr[2]")
                    .Descendants("tr")
                    .Skip(1)
                    .Where(tr => tr.Elements("td").Count() > 1)
                    .Select(tr => tr.Elements("td").Select(td => td.InnerText.Trim()).ToList())
                    .ToList();

和硒

      using (var driver = new ChromeDriver())
                {
                    driver.Navigate().GoToUrl("https://www.thpa.gr/index.php/en/services-3/search-ek");               
                    var containerInfo = driver.FindElementById("I dont have Id");
                }

标签: c#seleniumweb-scrapinghtml-agility-pack

解决方案


我所说的只是使用父 url 进行数据提取,您仍然可以使用 iframe 源路径访问您想要的内容

您可以实施类似的方法来提取所需的数据,此代码可能需要进行一些重构,但它让您了解如何进一步开发以满足您的业务需求

internal class Program
{
    private  static string LoadContent(string reference)
    {
        string url = $"https://portal.thpa.gr/fnet5/track/index.php";

        var hc = new HttpClient();

        var reqUrlContent =
             hc.PostAsync(url,
            new StringContent($"d=1&containerCode={reference}&go=1", Encoding.UTF8,
            "application/x-www-form-urlencoded"))
            .Result;
         

        Stream stream =  reqUrlContent.Content.ReadAsStreamAsync().Result;

        HtmlDocument doc = new HtmlDocument();

        doc.Load(stream);

        return doc.DocumentNode.InnerHtml;
    }

    private static void Main(string[] args)
    {
        HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
        doc.LoadHtml(LoadContent("OOLU0198315"));

        HtmlNode[] nodes = doc.DocumentNode
            .SelectNodes("//td[@style='padding:7px']")
            .ToArray();
        foreach (HtmlNode item in nodes)
        {
            Console.WriteLine(item.InnerHtml);
        }

        Console.ReadKey();
    }
}

结果

结果


推荐阅读