2010-10-23 58 views
1

我正在使用HPricot的css搜索來識別網頁中的表格。下面是一個示例HTML代碼段,我解析:HPricot css search:如何使用字符串選擇器選擇特定元素的父/祖先?

<table height=61 width=700> 
<tbody> 
<tr> 
<td><font size=3pt color = 'Blue'><b><A NAME=a1>Some header text</A></b></font></td></tr> 
... 
</tbody></table> 

有很多的頁表。我想找到包含A Name=a1參考的表格。 現在,我做的方式是

(page/"a[@name=a1]")[0].parent.parent.parent.parent.parent 

我不喜歡這個,因爲

  • 這是醜陋的
  • 這是很容易出錯(如果誰維護鄉親網頁刪除tbody?)

有沒有辦法告訴hpricot讓我的表祖先的指定元素?

編輯:下面是完全成熟的網頁我解析:http://www.blonnet.com/businessline/scoboard/a.htm

我感興趣的是兩個表,一個與季度業績,另一個年度業績的位。現在,我提取這些表格的方式是找到並從那裏移動。

回答

0

沒有看到整個頁面,很難給出明確的答案,但通常你的方式是正確的答案。你必須找到一個體面的地標,然後從那裏導航,如果它涉及備份鏈,那麼這就是你所做的。

您可能可以使用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

+0

謝謝你的%建議。我同意,如果我們沒有對源代碼的控制,那麼所有網頁解析都是容易出錯的,而且我並不是在面對更改時嘗試百分之百的彈性。但能夠說給我這個元素的「表」祖先是很好的。它也會更好地表達我的意圖。 – Rohith 2010-10-23 12:21:22

+0

好吧,有一些更好的信息,我們可以給你替代解決方案。如何將URL添加到您試圖解析您的問題的頁面?另外,http://stackoverflow.com/questions/734178/hpricot-with-firebugs-xpath可能會有用。 – 2010-10-23 19:20:19

+0

我編輯了這個問題,以添加一個鏈接到原始頁面 – Rohith 2010-10-25 09:06:02

1

Rohith是對的。它很醜,很容易出錯(比需要)。同樣如他所說,意圖說「找到最接近的父母是一張桌子」這一點更加清楚,並且這可以適用於任何兒童/父母關係。

如果用hpricot做到「不可能」,那麼就這麼說吧。但是,不要只說「無論如何試圖做到這一點是毫無希望的」。這是一個虛假的答案。它也不會幫助下一個人(我自己)尋找同一個問題的答案,但是出於不同的原因,這是解析許多頁面,其中差異被假定而不僅僅是擔心。

要真正回答這個問題......我還不知道。我沒有太多的希望與hpricot找出。這些文件絕對不可能存在。

但是,這裏有一個解決方法可以做同樣的事情。

table = (page%"a[@name=a1]").parent 
table = table.parent while table.name != "table"