2016-01-21 64 views
2

C#HtmlAgilityPack在LoadHtml函數後面添加tbody元素,即使在原始HTML文檔中不存在,也可以將其添加到表格中的DOM樹中。我如何禁用此功能?C#HtmlAgilityPack添加tbody

我的算法通過遍歷dom樹創建了一些XPATH表達式,原始文檔中的非現有tbody元素使SelectNodes找不到所需的項目。花了我很多時間來解決這個問題:|

是否有可能讓SelectNodes也考慮由HtmlAgilityPack添加的節點?

實施例:

<table> 
    <tr><td>data</td></tr> 
</table> 

我的應用將產生這種XPATH提取 '數據': //表/ TBODY/TR/TD

在表達的TBODY標記加到因爲它的在解析HTML代碼後由HtmlAgilityPack解析DOM樹,因爲即使它不存在,HtmlAgilityPack也會添加它。 因此

doc.DocumentNode.SelectNodes("//table/tbody/tr/td"); 

會失敗。

換句話說,tr元素(HtmlElement)父標記名等於'TBODY'而不是'TABLE'。另外我解析許多不同的網站,所以這是一種情況。

SelectNodes正在原始HTML代碼中進行搜索,而不是通過HtmlDocument.LoadHtml之後的DOM樹進行搜索,或者它不考慮它添加的「虛擬」元素。

+0

我想你只需要將'tr/d'改爲'tr/td'。 – recursive

回答

1

您不必使用完整的層次結構。

只需使用下面如果你想要是td S:

doc.DocumentNode.SelectNodes("//table//td"); 

或只是忽略tbody節點,並得到所有你關心的層次:

doc.DocumentNode.SelectNodes("//table//tr/td"); 
+0

這只是解決方法,該算法在創建xpath表達式時必須處理許多其他情況,並且不適合我的需要。 目前我只是從表情中刪除tbody標籤,但它也是一個壞主意,因爲當我解析其他網站時,一些網站確實有tbody標籤。另外,也許HtmlAgilityPack會將其他元素(如tbody)添加到DOM樹中,即使它們不存在。 – user3157855

+0

這不是一種解決方法。這是XPath的工作方式。請點擊此處:http://www.w3.org/TR/xpath/#node-tests。 '// table'選擇來自根節點的所有'table'元素後代,'// td'爲上下文節點的'table'元素子元素選擇所有'td'元素後代。 –

+1

我的意思是你的XPath代碼是可以的,但是在我的情況下它是解決方法。 一個網站有一個不是,誰知道HtmlAgilityPack將添加到其他網站(我必須解析未知的網站給我)其他元素。 – user3157855