如何解析包含多个标签的 html 节点?
How to parse an html node containing multiple tags?
我能够到达我想要提取的节点,但无法弄清楚如何在节点内分隔不同的标签。
p.s。我对正则表达式没问题;只是好奇 Html Agility Pack 是否存在更简单的方法。
代码:
...
...
HtmlNodeCollection nodes = webContent.DocumentNode.SelectNodes("//*[@id='node-name']/ul/li");
foreach (HtmlNode node in nodes) {
String link = ???; // extract the http link here (href)
String text = ???; // extract the inner text here
String nums = ???; // extract the content of <small> tag here
...
}
html样本:
...
...
<ul class="some-class-name">
<li>
<a href="http://link-1.com">text for link 1<small>1</small></a>
</li>
<li>
<a href="http://link-2.org">text for link 2<small>2</small></a>
</li>
<li>
<a href="http://link-3.net">text for link 3<small>3</small></a>
</li>
</ul>
...
...
您可以使用原生 API.
中的元素或后代
请记住,您可以使用 this 等扩展来启用 css 选择器查询,据我所知,这是首选(也是最简单)的方式。
下面是一段代码:
//
var doc = new HtmlDocument();
doc.LoadHtml(@"
<ul class='some -class-name'>
<li>
<a href = 'http://link-1.com' > text for link 1<small>1</small></a>
</li>
<li>
<a href = 'http://link-2.org' > text for link 2<small>2</small></a>
</li>
<li>
<a href = 'http://link-3.net' > text for link 3<small>3</small></a>
</li>
</ul>
");
Console.WriteLine("-------------------- Using Element(s) -------------------------");
//using Element(s), queries children in the next level only
var ul = doc.DocumentNode.Element("ul");
var lis = ul.Elements("li");
foreach(var li in lis)
{
var a = li.Element("a");
var href = a?.GetAttributeValue("href");
var smallText = a.Element("small")?.InnerText;
Console.WriteLine($"a href: [{href}] small: [{smallText}]");
}
Console.WriteLine("-------------------- Using Descendants -------------------------");
//using Descendants
var anchors = doc.DocumentNode.Descendants("a");
foreach(var a in anchors)
{
var href = a?.GetAttributeValue("href");
var smallText = a.Element("small")?.InnerText;
Console.WriteLine($"a href: [{href}] small: [{smallText}]");
}
输出:
我能够到达我想要提取的节点,但无法弄清楚如何在节点内分隔不同的标签。
p.s。我对正则表达式没问题;只是好奇 Html Agility Pack 是否存在更简单的方法。
代码:
...
...
HtmlNodeCollection nodes = webContent.DocumentNode.SelectNodes("//*[@id='node-name']/ul/li");
foreach (HtmlNode node in nodes) {
String link = ???; // extract the http link here (href)
String text = ???; // extract the inner text here
String nums = ???; // extract the content of <small> tag here
...
}
html样本:
...
...
<ul class="some-class-name">
<li>
<a href="http://link-1.com">text for link 1<small>1</small></a>
</li>
<li>
<a href="http://link-2.org">text for link 2<small>2</small></a>
</li>
<li>
<a href="http://link-3.net">text for link 3<small>3</small></a>
</li>
</ul>
...
...
您可以使用原生 API.
中的元素或后代
请记住,您可以使用 this 等扩展来启用 css 选择器查询,据我所知,这是首选(也是最简单)的方式。
下面是一段代码:
//
var doc = new HtmlDocument();
doc.LoadHtml(@"
<ul class='some -class-name'>
<li>
<a href = 'http://link-1.com' > text for link 1<small>1</small></a>
</li>
<li>
<a href = 'http://link-2.org' > text for link 2<small>2</small></a>
</li>
<li>
<a href = 'http://link-3.net' > text for link 3<small>3</small></a>
</li>
</ul>
");
Console.WriteLine("-------------------- Using Element(s) -------------------------");
//using Element(s), queries children in the next level only
var ul = doc.DocumentNode.Element("ul");
var lis = ul.Elements("li");
foreach(var li in lis)
{
var a = li.Element("a");
var href = a?.GetAttributeValue("href");
var smallText = a.Element("small")?.InnerText;
Console.WriteLine($"a href: [{href}] small: [{smallText}]");
}
Console.WriteLine("-------------------- Using Descendants -------------------------");
//using Descendants
var anchors = doc.DocumentNode.Descendants("a");
foreach(var a in anchors)
{
var href = a?.GetAttributeValue("href");
var smallText = a.Element("small")?.InnerText;
Console.WriteLine($"a href: [{href}] small: [{smallText}]");
}
输出: