【问题标题】:Scrape data from web page that using iframe c#从使用 iframe c# 的网页中抓取数据
【发布时间】:2020-11-25 18:12:55
【问题描述】:

我正在尝试从网页中获取一些数据 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的数据。

我尝试根据上一个问题获取这些数据 How can I scrape a table that is created with JavaScript in c#

但我无法遵循相同的解决方案。我尝试使用 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# selenium web-scraping html-agility-pack


【解决方案1】:

我只是说使用父 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();
    }
}

结果

【讨论】:

  • 谢谢,这正是我想要的。你能告诉我为什么它显示了 2 次相同的数据吗?
  • 我认为时间戳显示的数据不同
  • 是的,对不起,你是对的。这里面有两行数据。再次感谢。
猜你喜欢
  • 2017-01-16
  • 1970-01-01
  • 2013-02-16
  • 2021-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多