HtmlAgilityPack - 选择后代直到具有类的元素

问题描述 投票:0回答:2

我在我的 C# 应用程序中使用 HtmlAgilityPack 来抓取一些 HTML 代码。但是我在选择特定标签时遇到问题。

这是我的 HTML:

<div class="Post">
    <img src="image.png" alt="Alt Text">
    <br>
    <b>THIS TEXT IS WHAT I WANT</b>
    <div class="DesktopElements">
        <br>
        Hello world
    </div>
    <br>
    Some text here.
    <br>
    <b>Title</b>
    <br>
    Some more text here.
</div>

我想要做的是选择第一个“b”标签内的文本:

<b>THIS TEXT IS WHAT I WANT</b>
,但前提是它位于类“DesktopElements”的 div 之前。我不想在“DesktopElements”类之后选择任何内容。 如果
<b>
标签在那里,这很好用。但问题是,有时这个
<b>
标签不会出现。

到目前为止,我一直在尝试获取

<b>
的第一个
<div class="Post">
后代,但正如您可能意识到的那样,如果标签不存在,它将无法工作。有时它在那里,有时它不在那里。

所以我基本上只需要检查

<b>
<div class="Post">
之间的
<div class="DesktopElements">
标签,然后选择第一个(也是唯一的)
<b>

我该怎么做?

换句话说,有时它看起来像这样:

<div class="Post">
    <img src="image.png" alt="Alt Text">
    <br>
    <div class="DesktopElements">
        <br>
        Hello world
    </div>
    <br>
    Some text here.
    <br>
    <b>Title</b>
    <br>
    Some more text here.
</div>

如果是这样的话,我只是将“p.Title”设置为“none”。

这是我目前使用的代码:

p.Title = row.SelectSingleNode(".//div[@class='Post']").Descendants("b").Select(title => title.InnerText).Where(t => !string.IsNullOrWhiteSpace(t)).ToList().First();

这将捕获第一个

<b>
标签的 InnerText 值,但如果在
<div class="DesktopElements">
之前没有“b”标签,它将改为选择下面的
<b>
标签,上面写着
<b>Title</b>
这不是我想要的选择。

c# dom xpath nodes html-agility-pack
2个回答
1
投票

您可以使用

TakeWhile
只获取
<div class="DesktopElements">
之前的节点,而不是只获取
Descendants("b")

var node = doc.DocumentNode.SelectSingleNode(".//div[@class='Post']")
    .Descendants()
    .TakeWhile(node => !node.HasClass("DesktopElements"))
    .FirstOrDefault(node => node.Name == "b");

p.Title = node?.InnerText ?? "none";

参见示例小提琴


0
投票

我假设你想要这个 XPath:

//div[@class='Post']/div[@class='DesktopElements']/preceding-sibling::b

这将只选择那些

b
div[@class='DesktopElements']
之前成为
div[@class='Post']

的孩子

编辑

查看共享网址后,我注意到没有课程

Post
DesktopElements
。 取而代之的是课程:
PostText
ForumDesktopElements

不知道这怎么可能,但如果是这样的话,您将需要这个 XPath

//div[@class='PostText']/div[@class='ForumDesktopElements']/preceding-sibling::b
© www.soinside.com 2019 - 2024. All rights reserved.