沒有看到整個頁面,很難給出明確的答案,但通常你的方式是正確的答案。你必須找到一個體面的地標,然後從那裏導航,如果它涉及備份鏈,那麼這就是你所做的。
您可能可以使用XPATH查找表格,然後查看其中的鏈接,但這並不能真正改善事情,它只會改變它們。 Firefox插件Firebug可以很容易地將XPATH獲取到頁面中的元素,因此您可以找到有問題的表格,並讓Firebug向您顯示路徑,或者通過右鍵單擊xpath中的節點來複制它顯示,並將其過濾到您的查找中。
「這很醜陋」,也許吧,但並不是所有的代碼都是美麗的或優雅的,因爲並非所有問題都適合美麗和/或優雅的解決方案。有時我們必須對「有效」感到滿意。只要它可靠地工作,並且你知道爲什麼那麼你就領先於其他許多編碼器。
「...如果維護網頁的人刪除tbody?」,幾乎所有HTML或XML的解析都會遭受同樣的擔憂,因爲我們無法控制源碼。儘可能最好地編寫代碼,評論內容變化時可能失敗的點,然後交叉手指繼續前進。即使您正在解析TPS報告中的表格數據,也可能遇到同樣的問題。
我建議的唯一不同的做法是使用%
(又名「at」)而不是/
(又名AKA搜索)。 %
僅返回第一個匹配項,因此您可以刪除[0]
索引。
(page%"a[@name=a1]").parent.parent.parent.parent.parent
或
page%'//a[@name="a1"]/../../../../../..'
它使用XPath引擎到步驟備份鏈。如果速度是一個考慮因素,那應該會更快一點。
如果您知道目標表是唯一一個與寬度和高度,你可以用一個更具體的XPath:
page%'//table[@height=61 and @width=700]'
我建議引入nokogiri超過角度來說,Hpricot。
您還可以使用XPath從文檔的自上而下:
irb(main):039:0> print (doc/'//body/table[2]/tr/td[2]/table[2]').to_html[0..100]
<table height="61" width="700"><tbody>
<tr><td width="700" colspan="7" align="center"> <font size="3p=> nil
基本上的XPath模式是指:
發現身體標記,那麼第三個表,然後它的第三個單元格。在單元格中找到第三個表格。
注意:Firefox會自動將<tbody>
標記添加到源代碼,即使它不在接收的HTML文件中。這可能會讓你試圖使用Firefox查看源代碼來開發自己的XPath。
根據Firefox,您正在使用的另一張表是/html/body/table[2]/tbody/tr/td[2]/table[3]
,因此您必須去除tbody
。你也不需要停留在/html
。
謝謝你的%建議。我同意,如果我們沒有對源代碼的控制,那麼所有網頁解析都是容易出錯的,而且我並不是在面對更改時嘗試百分之百的彈性。但能夠說給我這個元素的「表」祖先是很好的。它也會更好地表達我的意圖。 – Rohith 2010-10-23 12:21:22
好吧,有一些更好的信息,我們可以給你替代解決方案。如何將URL添加到您試圖解析您的問題的頁面?另外,http://stackoverflow.com/questions/734178/hpricot-with-firebugs-xpath可能會有用。 – 2010-10-23 19:20:19
我編輯了這個問題,以添加一個鏈接到原始頁面 – Rohith 2010-10-25 09:06:02