2014-03-27 47 views
0

我想使用Fizzler在C#中解析一個網站。我的目標是獲得這個元素: /html/body/form/div [3]/div/div/div/div/div/table/tbody/tr [18]/td [2]/span(FireBug XPath) 。如何列出所有包含SPAN的TD元素?

問題是TR和TD號碼不固定。我只知道,我總是需要的最後一個跨度,在過去的TD,在過去的TR :)

我這個嘗試,但我得到的是NULL:

HtmlWeb document = new HtmlWeb(); 
HtmlAgilityPack.HtmlDocument doc = document.Load("http://websiteaddress.com/site-name.html"); 

HtmlNodeCollection tableDatas = doc.DocumentNode.SelectNodes("//table/tbody/tr/td/span").Last(); 

這是表我試圖解析。我只需要在最後一行的最後一個td中的最後一個跨度的內容。

<table id="ctl00_WebPartManager1_blablabla_ctl00_tblRates" cellspacing="5" cellpadding="5" rules="all" border="1" style="width:100%;"> 
       <tr> 
        <th></th><th><span>USD</span></th> 
       </tr><tr> 
        <th></th><th><span>USA $</span></th> 
       </tr><tr> 
        <th></th><th><span>1</span></th> 
       </tr><tr> 
        <td><span>2014. 03. 03.</span></td><td><span>227,31 </span></td> 
       </tr><tr> 
        <td><span>2014. 03. 04.</span></td><td><span>226,79 </span></td> 
       </tr><tr> 
        <td><span>2014. 03. 05.</span></td><td><span>225,66 </span></td> 
       </tr><tr> 
        <td><span>2014. 03. 06.</span></td><td><span>225,03 </span></td> 
       </tr><tr> 
        <td><span>2014. 03. 07.</span></td><td><span>223,14 </span></td> 
       </tr><tr> 
        <td><span>2014. 03. 10.</span></td><td><span>224,63 </span></td> 
       </tr><tr> 
        <td><span>2014. 03. 11.</span></td><td><span>226,06 </span></td> 
       </tr><tr> 
        <td><span>2014. 03. 12.</span></td><td><span>226,53 </span></td> 
       </tr><tr> 
        <td><span>2014. 03. 13.</span></td><td><span>223,63 </span></td> 
       </tr><tr> 
        <td><span>2014. 03. 14.</span></td><td><span>225,74 </span></td> 
       </tr><tr> 
        <td><span>2014. 03. 17.</span></td><td><span>224,67 </span></td> 
       </tr><tr> 
        <td><span>2014. 03. 18.</span></td><td><span>224,65 </span></td> 
       </tr><tr> 
        <td><span>2014. 03. 19.</span></td><td><span>223,26 </span></td> 
       </tr><tr> 
        <td><span>2014. 03. 20.</span></td><td><span>225,94 </span></td> 
       </tr><tr> 
        <td><span>2014. 03. 21.</span></td><td><span>226,25 </span></td> 
       </tr> 
      </table> 

這是結果我從document.load get()方法(它有點搞砸了...):

<table id="ctl00_WebPartManager1_blablabla_ctl00_tblRates" cellspacing="5" cellpadding="5" rules="all" border="1" style="width:100%;"> 
       <tr> 
        <th><th><span>USD</span> 
       <tr> 
        <th><th><span>USA $</span> 
       <tr> 
        <th><th><span>1</span> 
       <tr> 
        <td><span>2014. 03. 03.</span><td><span>227,31 </span> 
       <tr> 
        <td><span>2014. 03. 04.</span><td><span>226,79 </span> 
       <tr> 
        <td><span>2014. 03. 05.</span><td><span>225,66 </span> 
       <tr> 
        <td><span>2014. 03. 06.</span><td><span>225,03 </span> 
       <tr> 
        <td><span>2014. 03. 07.</span><td><span>223,14 </span> 
       <tr> 
        <td><span>2014. 03. 10.</span><td><span>224,63 </span> 
       <tr> 
        <td><span>2014. 03. 11.</span><td><span>226,06 </span> 
       <tr> 
        <td><span>2014. 03. 12.</span><td><span>226,53 </span> 
       <tr> 
        <td><span>2014. 03. 13.</span><td><span>223,63 </span> 
       <tr> 
        <td><span>2014. 03. 14.</span><td><span>225,74 </span> 
       <tr> 
        <td><span>2014. 03. 17.</span><td><span>224,67 </span> 
       <tr> 
        <td><span>2014. 03. 18.</span><td><span>224,65 </span> 
       <tr> 
        <td><span>2014. 03. 19.</span><td><span>223,26 </span> 
       <tr> 
        <td><span>2014. 03. 20.</span><td><span>225,94 </span> 
       <tr> 
        <td><span>2014. 03. 21.</span><td><span>226,25 </span> 

      </td></td></tr></td></td></tr></td></td></tr></td></td></tr></td></td></tr></td></td></tr></td></td></tr></td></td></tr></td></td></tr></td></td></tr></td></td></tr></td></td></tr></td></td></tr></td></td></tr></td></td></tr></th></th></tr></th></th></tr></th></th></tr></table> 

有人能幫助我,好嗎?

非常感謝!

+1

這是你的問題的一部分? http://stackoverflow.com/questions/18241029/why-does-my-xpath-query-scraping-html-tables-only-work-in-firebug-but-not-the –

+0

那麼,看看你提供的輸入: 是的。 –

回答

1

除了<tbody>元素being introduced by the browser,但不是HTML敏捷包(這就是爲什麼你根本沒有收到任何結果);使用[last()謂詞來訪問當前元素中的最後一個子元素。

//table/tr[last()]/td[last()]/span[last()] 

您還可以查詢所有的最後一個跨度,但是這可能是因爲它構建集全結果之前稍微慢一點:在C#中使用.Last();

(//table/tr/td/span)[last()] 

會甚至會更糟糕,因爲結果集甚至必須構造爲C#數組,而忽略除最後一個值之外的所有數據。

+0

你是對的,這是問題:)我唯一的問題是爲什麼它返回日期(2014. 03. 21.)而不是速率?所以我認爲它是取得第一個TD,而不是最後一個。 – VORiAND

+0

您必須查詢錯誤的數據或者費率不在輸入中。這個查詢絕對應該返回最後一個速度,對我來說(在BaseX中測試)。 –

+0

用Load()函數得到的結果更新了我的問題。我認爲問題是搞砸了表結構... – VORiAND

0

您可以使用last()而不是確切元素位置,以獲得結果集的最後一個元素:

//table/tr[last()]/td[last()]/span[last()] 

以上的XPath將得到最後<tr>,然後查找最後<td><tr>,然後尋找最後<span>在那<td>

如果這不是你想要的,我會建議發佈示例html,以使我們更容易更好地理解問題。

+0

謝謝,這對我也是NULL返回,但我將表數據添加到我的問題帖子中。 – VORiAND

相關問題