2010-06-12 114 views
3

所以我正在寫一個應用程序,將做一個小屏幕抓取。我正在使用HTML Agility Pack將整個HTML頁面加載到名爲docHtmlDocoument實例中。現在我想解析該文檔,尋找這個:如何使用HTML Agility Pack獲取​​標記中的所有內容?

<table border="0" cellspacing="3"> 
<tr><td>First rows stuff</td></tr> 
<tr> 
<td> 
The data I want is in here <br /> 
and it's seperated by these annoying <br /> 's. 

No id's, classes, or even a single <p> tag. </p> Just a bunch of <br /> tags. 
</td> 
</tr> 
</table> 

所以我只需要獲取第二行內的數據。我怎樣才能做到這一點?我應該使用正則表達式還是其他?

更新:這裏是我怎麼裝我doc

HtmlWeb hw = new HtmlWeb(); 
HtmlDocument doc = hw.Load(Url); 
+0

文檔中只有一張表嗎?如果不是,你將如何找到你感興趣的桌子? – 2010-06-12 05:38:13

+0

@Mark:基於'cellspacing =「3」'屬性。我明白這聽起來* hacky *(那是因爲它),但在1000+文檔中沒有其他表格包含cellspacing屬性。這不是生產代碼,只是我運行收集一些數據的項目。 – 2010-06-12 05:43:34

+0

你的標題和問題不同意。標題:'我如何獲得

標籤中的所有內容'問題:'所以我只需要獲取第二行內的數據。'這是什麼?你能修正它,以便標題和問題匹配嗎? – 2010-06-12 05:52:54

回答

2

由於您使用Html Agility Pack已經我會建議使用它提供找到你想要的信息的方法。有幾種方法可以瀏覽文檔,但其中最簡潔的一種是使用XPath。如果您使用的是敏捷包已經

HtmlDocument doc = new HtmlDocument(); 
doc.Load("input.html"); 
HtmlNode node = doc.DocumentNode 
        .SelectNodes("//table[@cellspacing='3']/tr[2]/td") 
        .Single(); 
string text = node.InnerText; 
+0

我認爲你在正確的軌道上,但我沒有在intellisense中看到'.Single()'方法。我正在使用HTML Agility Pack 1.4.0版。 – 2010-06-12 05:56:27

+1

添加引用並使用System.Data.Linq; – alexn 2010-06-12 05:57:19

+0

@alexn:我做到了,它仍然沒有出現。 – 2010-06-12 05:59:23

0

你可能會得到更好的里程與XML解析器。

0

「別的東西」是最好的答案--HTML最好通過HTML解析器解析,而不是通過正則表達式解析。我不是C#專家,但我聽說HTML Agility Pack非常喜歡這個用途。

+0

我已經在使用它了。我更新了我的答案以反映這一點。 – 2010-06-12 05:33:51

1
+0

通常我也會同意這一點,但我認爲這是一個例外,因爲我正在尋找如此狹窄的東西。但是,如果你可以**提出其他建議**,我也會接受。 – 2010-06-12 05:36:43

+0

看到了.. – 2010-06-12 05:54:42

0

,那麼它只是一個使用一些東西doc.DocumentNode.SelectNodes("//table[@cellspacing='3']")獲得文檔中的表格的事:在這種情況下,你可以使用這樣的事情。嘗試查看文檔和編碼示例。由於您已經擁有結構化的數據,因此回到文本數據並進行重新分析是很荒謬的。

相關問題