c# - 从使用 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");
}
解决方案
我所说的只是使用父 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();
}
}
结果
推荐阅读
- php - 刚刚将 Laravel 项目移到新服务器上,但无法序列化 JSON
- primefaces - IBM AppScan - Java 反序列化代码执行 - JSF 2.2 和 Primefaces - JBOSS 7.2 EAP
- asp.net-core - 我们可以在视图中提供类似于结构的 WWWROOT 文件夹以在 asp.net 核心中下载文件吗
- rust - 为什么将函数移动到默认特征方法会引入借用错误?
- python - 使用来自 scipi 的 fft 来缩放 X 的适当方法是什么?
- javascript - 使用 Service Worker 将标头添加到响应中
- python - 当我运行它时,它像往常一样运行,但它似乎重复了一次。为什么会这样?
- php - 如何在 WooCommerce 中隐藏某个类别的运输区域?
- performance - 像 C#、Go、Rust、Scala 这样的编程语言会被自己重写,这不会让它们太慢吗?
- sequelize.js - 我如何在sequelize中写findAll