在XPath中对结果进行分组

时间:2016-07-08 11:37:04

标签: c# xml xpath html-agility-pack

简介:

假设我们有这样的HTML代码:

 echo kartik\date\DatePicker::widget([
             'model' => $objPatientModel,
             'form'=>$objActiveForm,
             'attribute' => 'date_of_birth',
             'options' => ['placeholder' => 'Enter birth date ...'],**//id is not used here**
             'pluginOptions' => [
                 'format' => 'dd-mm-yyyy',
                 'endDate' => date('d-m-Y'),
             ]
         ]);

页面是这样的:

Sample Image

您可以在此处查看原始网站:SubScene

我正在编写一个C#Desktop应用程序,它可以获取该站点的信息。

在学习HTML Agility Pack之前,我使用正则表达式。

使用这种模式:<div class="search-result"> <h2>TV-Series</h2> <ul> <li> <div class="title"> <a href="/subtitles/prison-break-sequel-first-season">Prison Break : Sequel - First Season</a> </div> <span class="subtle count">10 subtitles</span> </li> <li> <div class="title"> <a href="/subtitles/prison-break-fourth-season">Prison Break - Fourth Season</a> </div> <span class="subtle count">1232 subtitles</span> </li> </ul> <h2>Popular</h2> <ul> <li> <div class="title"> <a href="/subtitles/prison-break-fourth-season">Prison Break - Fourth Season (2008)</a> </div> <div class="subtle count"> 1232 subtitles </div> </li> <li> <div class="title"> <a href="/subtitles/prison-break-third-season">Prison Break - Third Season (2007)</a> </div> <div class="subtle count"> 644 subtitles </div> </li> </ul> </div> 我将系列分开(如Tv系列,热门和......)。

然后在Rgular Expression上使用此模式:<h2>[\s\S]+?</ul>我从此站点获得分类信息。

使用MatchCollection&amp;使用组(与括号相同),我在Regex中的方法,返回给我每个系列的二维列表,每一行都是关于一个电影,列包括:电影名称,字幕数和字幕下载链接。

并且二维列表变得像DataBase这样的东西: enter image description here

现在我学习了 HTML Agility Pack

问题:

1 - 如何使用XPath在HTML Agility Pack中创建这样的列表?

2 - 我可以使用哪个XPath创建像之前看到的Regex这样的组?

非常感谢你。

1 个答案:

答案 0 :(得分:1)

Martin Honnen的评论是正确的,没有什么功能可以提供&#39;分组&#39;通过XPath。但是,可以使用循环并在元素集上运行一组XPath来提取所需的数据。

首先,提取每个标题元素,然后从标题中提取每个列表项,并运行一个文件XPath以从每个文件中提取所需的值。

注意:此代码是针对XDocument而不是使用HTML Agility Pack使用XPath编写的,但XPath应该是相同的。

var titleNodes = d.XPathSelectElements("/div[@class='search-result']/h2");
foreach (var titleNode in titleNodes)
{
    string title = titleNode.Value.Dump();
    var listItems = titleNode.XPathSelectElements("following-sibling::ul[1]/li");

    foreach (var listItem in listItems)
    {
        var itemData = listItem.XPathEvaluate("div[@class='title']/a/text() | *[@class='subtle count']/text()");
    }
}

请注意在最后一个表达式中使用XPath |运算符,以在单个XPath调用中选择多个不同子项的值。这些值有点分组&#39;就像你想要的那样