简介:
假设我们有这样的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'),
]
]);
页面是这样的:
您可以在此处查看原始网站: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中的方法,返回给我每个系列的二维列表,每一行都是关于一个电影,列包括:电影名称,字幕数和字幕下载链接。
现在我学习了 HTML Agility Pack 。
问题:
1 - 如何使用XPath在HTML Agility Pack中创建这样的列表?
2 - 我可以使用哪个XPath创建像之前看到的Regex这样的组?
非常感谢你。
答案 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;就像你想要的那样