【问题标题】:Cannot get li that belong to a specific ul无法获取属于特定 ul 的 li
【发布时间】:2022-07-16 15:56:18
【问题描述】:

我有这样的结构:

<ul>
    <li class="list-group-item px-0">
        <h2>Foo</h2>
        <ul>
            <li class="list-group-item">
                <h3>Test</h3>
            </li>
        </ul>
    </li>
     <li class="list-group-item px-0">
        <h2>Contoso</h2>
        <ul>
            <li class="list-group-item">
                <h3>Test 2</h3>
            </li>
        </ul>
    </li>
</ul>

我正在尝试获取属于迭代中节点的所有 li,这是第一个 ul,所以结果应该返回:Foo 和 Contoso 但我得到了所有可用的 li,这是我的代码:

var liCollection = node.SelectNodes(".//ul/li[@class='list-group-item']");

我可以通过添加 px-0 来解决这个问题,但在迭代中只能获取与第一个 ul 关联的 li?

完整代码:

https://pastebin.com/wjE2q1n2

【问题讨论】:

  • @Stefan 抱歉只是我的示例(已修复)以显示完整代码:pastebin.com/wjE2q1n2
  • 我认为你的问题是“//ul”而不是“/ul”。使用两个 // 您正在搜索所有 ul 元素。同一个,仅在当前元素中。 docs.microsoft.com/en-us/previous-versions/dotnet/…
  • @Victor 如果我切换到node.SelectNodes("./ul/li");,我会得到null。如果你看完整的代码,你可以看到node实际上是手风琴,例如:&lt;div id="collapse0"
  • 尝试只获取第一个节点 (SelectSingleNode)。你得到第一个 li。然后,获取最接近的 ul (或相同的父级)并使用 XPath 单 / 来获取 li (“./li[@class='list-group-item']”,如果我没记错的话)
  • @sfarzoso 看看更新的答案。我分享了一种方法,将所有数据组合并提取为 json

标签: c# html-agility-pack


【解决方案1】:

我做了一个完全不同的选择:

html1 = File.ReadAllText("input.html");
var htmlDoc = new HtmlDocument();
htmlDoc.LoadHtml(html1);

var i = 0;
var uls = htmlDoc.DocumentNode.SelectNodes("//span[@class]/../../div[1]/*");
foreach (HtmlNode ul in uls)
{
    var group = ul.InnerText.Replace('\r',' ').Replace('\n',' ').Trim();
    foreach( HtmlNode subul in ul.SelectNodes("./../../div[2]/*"))
    {
        var sub = subul.InnerText.Trim();
        if (!string.IsNullOrEmpty(sub)) Console.WriteLine($"{group}: {sub}");
    }
}

输出:

A: Apparato gastrointestinale e metabolismo
A01: Preparati stomatologici
A01A: Preparazioni stomatologiche
A02: Farmaci per malattie correlate all'acidosi
A02A: Antiacidi
A02B: Farmaci per l'ulcera peptica e la malattia da reflusso gastroesofageo (gerd)
A03: Farmaci per malattie gastrointestinali funzionali
A03A: Farmaci malattie gastrointestinali funzionali
A03B: Belladonna e derivati
A03F: Procinetici
A04: Antiemetici e antinausea
A04A: Antiemetici e antinausea
A05: Bile e terapia del fegato
A05A: Terapia per la bile
...

【讨论】:

    【解决方案2】:

    我根据您的需要制作了一个样本。我想这就是你想要达到的目标!

    var list = doc.DocumentNode.SelectNodes(
        "//div[@class='shadow-sm autoscroll my-1']"); 
    
    var collection = list.Select(x => x.SelectNodes(".//ul/li[@class='list-group-item']"));
    
    //This is for "A", "B" etc
    var category = list.Select(x => x.SelectNodes(".//span[contains(@class, 'badge-light')]"));
    
    //This is for "A01A" etc
    var listTitles = list.Select(x => x.SelectNodes(".//ul/li[@class='list-group-item']//span"));
    
    //This is for "Preparazioni stomatologiche" etc
    var descriptions = list.Select(x => x.SelectNodes(".//ul/li[@class='list-group-item']//a"));
    

    以此为指导,您可以抓取您真正想要的数据..

    更新

    结合在一起:

    var doc = new HtmlDocument();
    doc.Load(Directory.GetCurrentDirectory() + "/html.txt");
    
    var data = doc.DocumentNode.SelectNodes("//div[@class='shadow-sm autoscroll my-1']");
    
    List<dynamic> objects = new();
    foreach (var item in data)
    {
        foreach (var sub in item.SelectNodes(".//ul[contains(@class, 'list-group')]//li"))
        {
            var obj = new
            {
                Category = item.SelectSingleNode(".//div[@class='mb-1']//span").InnerText.Trim(),
                Description = item.SelectSingleNode(".//div[@class='mb-1']//h2").InnerText.Trim(),
                Sub = new
                {
                    SubCategories = sub.SelectSingleNode(".//span").InnerText.Trim(),
                    SubDescriptions = sub.SelectSingleNode(".//a").InnerText.Trim(),
                }            
            };
            objects.Add(obj); 
        }
    }
    
    var json = JsonSerializer.Serialize(objects, new JsonSerializerOptions { WriteIndented = true });
    

    输出:https://i.imgur.com/zvNo3US.png

    【讨论】:

      猜你喜欢
      • 2013-11-17
      • 1970-01-01
      • 1970-01-01
      • 2013-09-04
      • 2023-03-13
      • 2022-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多