【问题标题】:Filter a string from html agility pack从 html 敏捷包中过滤字符串
【发布时间】:2021-03-24 23:01:45
【问题描述】:

我从 URL 中获取 html,然后选择元素 table 并选择 table 内的所有 tr 元素,这些元素在其 id 属性值中包含 tr。现在我有大约 20 个这样的元素:

<th class="nw">1 Jan</th><td class="nw">Friday</td><td><a href="/holidays/andorra/new-year-day">New Year's Day</a></td><td>National holiday</td>

如何从上面的元素中分别获取每个文本?
示例输出:1 Jan/Friday/New Year's Day/National holiday

var url = "https://www.timeanddate.com/holidays/andorra/";
var client = new HttpClient();
client.DefaultRequestHeaders.Add("Accept-Language", "en-US,en;q=0.5");
var html = await client.GetStringAsync(url);

var document = new HtmlAgilityPack.HtmlDocument();
document.LoadHtml(html);

var a1 = document.DocumentNode.Descendants("table")
    .Where(node => node.GetAttributeValue("id","").Equals("holidays-table"))
    .ToList();

var a2 = a1[0].Descendants("tr")
    .Where(node => node.GetAttributeValue("id","").Contains("tr"))
    .ToList();

【问题讨论】:

    标签: c# web-scraping html-agility-pack


    【解决方案1】:

    这应该会给你你想要的:

    List<List<string>> holidays = document
        .DocumentNode
        .SelectNodes("//table[@id='holidays-table']/tbody/tr")
        .Select(tr => tr.ChildNodes
                        .Where(n => n.Name == "th" || n.Name == "td")
                        .Select(n => n.InnerText.Trim())
                        .ToList())
        .Where(row => row.Any())  // filter out empty rows
        .ToList();
    
    foreach (var row in holidays)
    {
        Console.WriteLine(string.Join(", ", row));
    }
    

    这里的工作演示:https://dotnetfiddle.net/0SADls

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-26
      • 1970-01-01
      • 2014-01-01
      • 2016-06-01
      • 2017-06-21
      相关资源
      最近更新 更多