使用 htmlagilitypack 获取特定标签后面的 p 标签

发布于 2024-12-12 21:27:10 字数 365 浏览 3 评论 0原文

我正在使用 htmlagilitypack c# 抓取一个网站:

i have in the source code of an html page

....
<p>this a p that come before h3</p>
....
....
<h3>this h3 </h3>

<p>first p after h3</p>

....

<p>seconde p after h3</p>

我想获取所有随后出现的 Ps

,有没有一种方法可以使用位置来过滤 Ps。

其中(位置(p)>位置(h3))

I'm crawling a website using htmlagilitypack c#:

i have in the source code of an html page

....
<p>this a p that come before h3</p>
....
....
<h3>this h3 </h3>

<p>first p after h3</p>

....

<p>seconde p after h3</p>

i want to to all get all Ps that come after

is there a way to use a where to filter Ps using position.

where (position(p)>position(h3))

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

拥有 2024-12-19 21:27:10

您可以使用如下所示的辅助方法:

static IEnumerable<HtmlNode> FilteredTakeWhile(
    HtmlNode root,
    Func<HtmlNode, bool> predicate,
    Func<HtmlNode, bool> takePredicate)
{
    for (var currentNode = root.NextSibling;
         currentNode != null && takePredicate(currentNode);
         currentNode = currentNode.NextSibling)
    {
        if (predicate(currentNode))
            yield return currentNode;
    }
}

然后使用它:

var h3 = doc.DocumentNode.SelectSingleNode("h3");
// take all "p" nodes while we haven't reached the next "h3" node
var query = FilteredTakeWhile(h3, node => node.Name == "p", node => node.Name != "h3");

You could use a helper method such as this:

static IEnumerable<HtmlNode> FilteredTakeWhile(
    HtmlNode root,
    Func<HtmlNode, bool> predicate,
    Func<HtmlNode, bool> takePredicate)
{
    for (var currentNode = root.NextSibling;
         currentNode != null && takePredicate(currentNode);
         currentNode = currentNode.NextSibling)
    {
        if (predicate(currentNode))
            yield return currentNode;
    }
}

Then to use it:

var h3 = doc.DocumentNode.SelectSingleNode("h3");
// take all "p" nodes while we haven't reached the next "h3" node
var query = FilteredTakeWhile(h3, node => node.Name == "p", node => node.Name != "h3");
你的呼吸 2024-12-19 21:27:10

尝试以下代码:

var htmlText = "source code of your html page";
var htmlDoc.LoadHtml(htmlText);
var h3= htmlDoc.DocumentNode.SelectNodes("//h2");
var lineNum = h3[0].Line;
var p = htmlDoc.DocumentNode.SelectNodes("//p").Where(x => x.Line > lineNum);

Try the following code:

var htmlText = "source code of your html page";
var htmlDoc.LoadHtml(htmlText);
var h3= htmlDoc.DocumentNode.SelectNodes("//h2");
var lineNum = h3[0].Line;
var p = htmlDoc.DocumentNode.SelectNodes("//p").Where(x => x.Line > lineNum);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文