在解释之前,我使用的是VB.net和HtmlAgilityPack。
我有以下html,所有三个部分都具有相同的格式。我正在使用htmlagilitypack从Title和Date中提取数据。我的代码正确提取标题,但日期仅从第一个实例中提取并重复3次:
HtmlAgilityPack代码:
For Each h4 As HtmlNode In docnews.DocumentNode.SelectNodes("//h4[(@class='title')]")
Dim date1 As HtmlNode = docnews.DocumentNode.SelectSingleNode("//span[starts-with(@class, 'date ')]")
Dim newsdate As String = date1.InnerText
MessageBox.Show(h4.InnerText)
MessageBox.Show(newsdate)
Next
我认为在每个h4中,我都会相应地得到相关日期......
HTML code:
<div class="article-header" style="" data-itemid="920729" data-source="ABC" data-preview="Text 1">
<h4 class="title"><a href="URL" class="title" title="Text 1">Text for Mr. A</a></h4>
<div class="byline">
<span class="date timestamp"><span title="29 November 2013">29-11-2013</span></span>
<span class="source" title="AGE">18</span>
</div>
<div class="preview">Text 1 Preview</div>
</div>
<div class="article-header" style="" data-itemid="920720" data-source="ABC" data-preview="Text 2">
<h4 class="title"><a href="URL" class="title" title="Text 2">Text for Mr. B</a></h4>
<div class="byline">
<span class="date timestamp"><span title="27 November 2013">27-11-2013</span></span>
<span class="source" title="AGE">25</span>
</div>
<div class="preview">Text 2 Preview</div>
</div>
<div class="article-header" style="" data-itemid="920719" data-source="ABC" data-pre+view="Text 3">
<h4 class="title"><a href="URL" class="title" title="Text 3">Text for Mr. C</a></h4>
<div class="byline">
<span class="date timestamp"><span title="22 October 2013">22-10-2013</span></span>
<span class="source" title="AGE">20</span>
</div>
<div class="preview">Text 3 Preview</div>
</div>
最终输出应为:
A先生的文字
29-11-2013
B先生的文字
27-11-2013
C先生的文字
22-10-2013
我的代码是什么:
A先生的文字
29-11-2013
B先生的文字
29-11-2013
C先生的文字
29-11-2013
非常感谢任何帮助。
答案 0 :(得分:1)
您需要将第二个XPath锚定在h4
:
Dim date1 As HtmlNode = h4.Parent.SelectSingleNode(".//span[starts-with(@class, 'date ')]")
^^^^^^^^^ ^^^
.//
告诉Xpath查看执行Xpath的节点。因此,通过SelectSingleNode
调用h4.Parent
,您可以获得div
的父h4
标记下方的日期。