【问题标题】:Parsing Table doesn't get all td elements解析表没有得到所有 td 元素
【发布时间】:2019-09-02 12:35:50
【问题描述】:

我正在使用C#HTMLAgilityPack 解析一个HTML 表格,但并不是每一行都返回了所有td 元素。它获得了第一和第三和第四,但错过了第二。

我已经循环了代码,但不明白我哪里出错了。

HTML:

<tr>
  <td>08:15</td>
  <td>EZY891</td>
  <td>London Gatwick</td>
  <td>Cancelled</td>
  <td><img class="bt_tweet_img" src="~/_Layouts/15/images/C5.PortOfJersey/content/Twitter_Logo_Blue.svg"alt="2019/09/02 08:15 GMT+00:00|EZY891"></td>
</tr>

代码 c#

//set the url we are interested in
string urlstring = 
"http://www.jerseyairport.com/flight/Pages/arrivals.aspx";
//use HTML Agilitypack to do the rest
HtmlWeb web = new HtmlWeb();
HtmlDocument document = web.Load(urlstring);      

foreach (HtmlNode flightdiv in 
document.DocumentNode.SelectNodes("//table[@id='airport" + "arrivals" 
+ "']/tbody//tr"))

{
 foreach (HtmlNode col in flightdiv.SelectNodes("td"))

            {
                System.Diagnostics.Debug.WriteLine(col.InnerText);

            }
}

我希望循环遍历每个元素,但它直接从 08:15 到 London Gatwick 缺少 EZY891

【问题讨论】:

  • 该网站没有&lt;td&gt;EZY891&lt;/td&gt; 的列。你从哪里得到这些信息的?
  • 您的网址错误,请使用https://www.jerseyairport.com/Flight/Pages/Arrivals.aspx。如果您使用此处的那个,它会将您重定向到具有较少列的不同页面。
  • 抱歉,我一定遗漏了什么。我正在使用网站jerseyairport.com/Flight/Pages/Arrivals.aspx。它有4列Sched./Flight No./Origin/Status。它返回 Sched./Origin/Status。即它错过了第二个航班号。

标签: c# html-agility-pack


【解决方案1】:

使用 HTMLAgilityPack 有什么特别的原因吗?

我给你一个 Selenium 库的工作代码。我使用这 2 个库“OpenQA.Selenium.Chrome”和“OpenQA.Selenium”只是确保您的 Chrome 的版本是兼容的。

static void Main(string[] args)
{
    var options = new ChromeOptions();           
    options.BinaryLocation = AppDomain.CurrentDomain.BaseDirectory + @"\chrome.exe";
    ChromeDriver driver = new ChromeDriver(options);           
    driver.Navigate().GoToUrl("http://www.jerseyairport.com/flight/Pages/arrivals.aspx");

    IWebElement table = driver.FindElementById("airportarrivals");
    IReadOnlyCollection<IWebElement> tdElements = table.FindElements(By.TagName("td"));
    foreach(IWebElement webElement in tdElements)
    {
        Console.WriteLine(webElement.GetAttribute("innerText"));
        Console.ReadLine();
    }
}

输出:

08:15
London Gatwick
Cancelled

13:10
Southampton
Landed at 13:16

13:10
London Gatwick
Landed at 13:25

13:10
London Gatwick
Landed at 13:25

13:25
Birmingham
Landed at 13:11

【讨论】:

  • 在 HTMLAgilityPack 上使用 Selenium 有什么好处吗?此外,您的代码仍然只返回 3 列。它错过了航班号。
  • 对不起,我复制了第一个 URL 而不是第二个。将网址更改为“jerseyairport.com/Flight/Pages/Arrivals.aspx”,您还将获得航班号。如果您需要收集大量信息(大约 200 个元素在 WebElements 上逐一循环),Selenium 可能会更慢。但是,在我看来,它比 HTMLAgilityPack 更友好,并且可以首先将 Attributes 用作字符串,然后寻找正确的 IWebElement。
【解决方案2】:

我刚刚检查了网站,该表中没有第二列,因此您的代码运行正常

您更新后的网址仍在转发至https://www.jerseyairport.com/Pages/Default.aspx 哪个没有航班号

【讨论】:

  • 抱歉,它有 4 列。为什么我不能得到第二列。?
【解决方案3】:

感谢您提供的所有答案。答案很简单。我在网址中使用了http://www.jerseyairport.com/flight/Pages/arrivals.aspx,而不是https://www.jerseyairport.com/flight/Pages/arrivals.aspx。 一旦我纠正它工作正常。 再次感谢

【讨论】:

    猜你喜欢
    • 2012-09-12
    • 1970-01-01
    • 2019-10-13
    • 1970-01-01
    • 1970-01-01
    • 2012-08-29
    • 2022-01-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多