我在我的 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>
这不是我想要的选择。
我假设你想要这个 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