2012-06-29 47 views
1

我建立一个应用程序从网站拉条新闻却无法得到它的发现与DD标签的XPath不拾取DD标签

在哪里我错了任何想法节点?

HTML

<h1>INFO: New Prices</h1> 
<dl class='table'> 
    <dt>Department:</dt><dd>Sales</dd> 
    <dt>Start Date:</dt><dd>28/06/2012</dd> 
    <dt>End Date:</dt><dd>20/07/2012</dd> 
    <dt>Approved Date:</dt><dd>Jun 28 2012 3:11PM</dd> 
</dl> 

C#代码

public void CollectNewsItem(UInt64 aSID) 
{ 
    String URL = WebReader.storyLink + "?SID=" + aSID; 

    HtmlWeb hw = new HtmlWeb(); 
    HtmlDocument document = hw.Load(URL); 

    HtmlNode n = document.DocumentNode.SelectSingleNode("//h1"); 

    Console.WriteLine("Title: " + n.InnerText); 

    HtmlNodeCollection nodes = document.DocumentNode.SelectNodes("//dd"); 

    foreach (HtmlNode node in nodes) 
    { 
     Console.WriteLine(node.InnerText); 
    } 

} 
+0

是它找到'h1'标签OK? – bluevector

+0

是的h1标签正在被发现并输出正确 –

+0

而且我认为,如果你改变“// dd”为“// dl”它会发现。 “/ dt”怎么样?也许是因为'dd's在'dl'里面...... – bluevector

回答

0

这是正确的方式按这个线程:

How to parse these tags?

为了确保它的工作,做到这一点:

var node = document.DocumentNode.SelectSingleNode("//[dt='Department:']"); 

它至少应该拿起第一dt。如果没有,那么你的HTML标记中肯定会有问题,解析器也会变得困惑! :)

另一件事尝试...复制/ HTML粘贴到一个简单的HTML文件,并喂你的代码。

替换该行(单引号表):

<dl class='table'> 

与这一个(双引号之间的表):

<dl class="table"> 

如果以上仍不能正常工作,请尝试删除冒号(:)前关闭每个<\dt>标签。这样做是为了解决导致问题的原因。

+0

你为什么使用谓词?他只想要带有dd标记 –

+0

的节点仍然找不到它。我无法控制HTML标记:( –

+0

@SleepyRhino:请参阅新测试的更新答案... –

0

我更喜欢在使用HtmlAgilityPack时下载到LINQ。在这种情况下,您的选择是这样的:

IEnumerable<HtmlNode> nodes = document.DocumentNode.Descendants("dd");