2015-09-12 65 views
0

我有我的數據庫中的大學籃球隊列表。名稱完全匹配,因爲它們在我試圖解析的網站上找到。該網站是一個大桌子。我想根據數據庫中的這些團隊選擇/匹配特定的單元格。如果是css或xpath選擇方法,我沒有偏好。無論什麼作品。這裏是返回的一個小樣本(添加了一些換行符視覺目的):通過Nokogiri選擇精確的數據

doc = Nokogiri::HTML(open("http://kenpom.com/")) 
=> #<Nokogiri::XML::Element:0x3fd7f39c14e4 name="tbody" 
children=[#<Nokogiri::XML::Text:0x3fd7f39c1174 "\n">, #<Nokogiri::XML::Element:0x3fd7f39c0fd0 name="tr" 
children=[#<Nokogiri::XML::Element:0x3fd7f39c0cd8 name="td" 
children=[#<Nokogiri::XML::Text:0x3fd7f39c0a6c "1">]>, #<Nokogiri::XML::Element:0x3fd7f39c0800 name="td" attributes=[#<Nokogiri::XML::Attr:0x3fd7f39c0774 name="style" value="text-align:left;">] 
children=[#<Nokogiri::XML::Element:0x3fd7f39c0224 name="a" attributes=[#<Nokogiri::XML::Attr:0x3fd7f39c01c0 name="href" value="team.php?team=Kentucky">] 
children=[#<Nokogiri::XML::Text:0x3fd7f39bdc40 "Kentucky">]>, #<Nokogiri::XML::Text:0x3fd7f39bda38 " ">, #<Nokogiri::XML::Element:0x3fd7f39bd984 name="span" attributes=[#<Nokogiri::XML::Attr:0x3fd7f39bd90c name="class" value="seed">] 
children=[#<Nokogiri::XML::Text:0x3fd7f39bd3d0 "1">]>]>, #<Nokogiri::XML::Element:0x3fd7f39bd100 name="td" 
children=[#<Nokogiri::XML::Element:0x3fd7f39bcebc name="a" attributes=[#<Nokogiri::XML::Attr:0x3fd7f39bce58 name="href" value="conf.php?c=SEC">] 
children=[#<Nokogiri::XML::Text:0x3fd7f39bc994 "SEC">]>]>, #<Nokogiri::XML::Element:0x3fd7f39bc69c name="td" 
children=[#<Nokogiri::XML::Text:0x3fd7f39bc480 "38-1">]>, #<Nokogiri::XML::Element:0x3fd7f39bc2b4 name="td" 
children=[#<Nokogiri::XML::Text:0x3fd7f39bc070 ".9757">]>, #<Nokogiri::XML::Element:0x3fd7f39b9d34 name="td" attributes=[#<Nokogiri::XML::Attr:0x3fd7f39b9cd0 name="class" value="divide">] 
children=[#<Nokogiri::XML::Text:0x3fd7f39b967c "119.3">]>, #<Nokogiri::XML::Element:0x3fd7f39b93d4 name="td" 
children=[#<Nokogiri::XML::Element:0x3fd7f39b9140 name="span" attributes=[#<Nokogiri::XML::Attr:0x3fd7f39b90b4 name="class" value="seed">] 
children=[#<Nokogiri::XML::Text:0x3fd7f39b8a10 "5">]>]>, #<Nokogiri::XML::Element:0x3fd7f39b86dc name="td" 
children=[#<Nokogiri::XML::Text:0x3fd7f39b82a4 "86.5">]>, #<Nokogiri::XML::Element:0x3fd7f39b5fcc name="td" 
children=[#<Nokogiri::XML::Element:0x3fd7f39b5db0 name="span" attributes=[#<Nokogiri::XML::Attr:0x3fd7f39b5d24 name="class" value="seed">] 
children=[#<Nokogiri::XML::Text:0x3fd7f39b57e8 "2">]>]>, #<Nokogiri::XML::Element:0x3fd7f39b54b4 name="td" attributes=[#<Nokogiri::XML::Attr:0x3fd7f39b5450 name="class" value="divide">] 
children=[#<Nokogiri::XML::Text:0x3fd7f39b4e38 "63.5">]>, #<Nokogiri::XML::Element:0x3fd7f39b4ab4 name="td" 
children=[#<Nokogiri::XML::Element:0x3fd7f39b4820 name="span" attributes=[#<Nokogiri::XML::Attr:0x3fd7f39b47bc name="class" value="seed">] 
children=[#<Nokogiri::XML::Text:0x3fd7f39b4258 "251">]>]>, #<Nokogiri::XML::Element:0x3fd7f39b1ef4 name="td" attributes=[#<Nokogiri::XML::Attr:0x3fd7f39b1e54 name="class" value="divide">] 
children=[#<Nokogiri::XML::Text:0x3fd7f39b1904 "+.048">]>, #<Nokogiri::XML::Element:0x3fd7f39b1710 name="td" 
children=[#<Nokogiri::XML::Element:0x3fd7f39b1314 name="span" attributes=[#<Nokogiri::XML::Attr:0x3fd7f39b1288 name="class" value="seed">] 
children=[#<Nokogiri::XML::Text:0x3fd7f39b0cfc "69">]>]>, #<Nokogiri::XML::Element:0x3fd7f39b0810 name="td" attributes=[#<Nokogiri::XML::Attr:0x3fd7f39b0798 name="class" value="divide">] 
children=[#<Nokogiri::XML::Text:0x3fd7f39add68 ".6829">]>, #<Nokogiri::XML::Element:0x3fd7f39adb88 name="td" 
children=[#<Nokogiri::XML::Element:0x3fd7f39ad980 name="span" attributes=[#<Nokogiri::XML::Attr:0x3fd7f39ad91c name="class" value="seed">] 
children=[#<Nokogiri::XML::Text:0x3fd7f39ad430 "31">]>]>, #<Nokogiri::XML::Element:0x3fd7f39ad0ac name="td" 
children=[#<Nokogiri::XML::Text:0x3fd7f39ace90 "106.0">]>, #<Nokogiri::XML::Element:0x3fd7f39acc9c name="td" 
children=[#<Nokogiri::XML::Element:0x3fd7f39aca94 name="span" attributes=[#<Nokogiri::XML::Attr:0x3fd7f39aca1c name="class" value="seed">] 
children=[#<Nokogiri::XML::Text:0x3fd7f39ac5a8 "31">]>]>, #<Nokogiri::XML::Element:0x3fd7f39ac2b0 name="td" 
children=[#<Nokogiri::XML::Text:0x3fd7f39ac0a8 "99.2">]>, #<Nokogiri::XML::Element:0x3fd7f39a9ed4 name="td" 
children=[#<Nokogiri::XML::Element:0x3fd7f39a9c90 name="span" attributes=[#<Nokogiri::XML::Attr:0x3fd7f39a9bc8 name="class" value="seed">] 
children=[#<Nokogiri::XML::Text:0x3fd7f39a96f0 "29">]>]>, #<Nokogiri::XML::Element:0x3fd7f39a9394 name="td" attributes=[#<Nokogiri::XML::Attr:0x3fd7f39a9308 name="class" value="divide">] 
children=[#<Nokogiri::XML::Text:0x3fd7f39a8c78 ".5560">]>, #<Nokogiri::XML::Element:0x3fd7f39a8a5c name="td" 
children=[#<Nokogiri::XML::Element:0x3fd7f39a8714 name="span" attributes=[#<Nokogiri::XML::Attr:0x3fd7f39a864c name="class" value="seed">] 
children=[#<Nokogiri::XML::Text:0x3fd7f39a8084 "100">]>]>]>, #<Nokogiri::XML::Text:0x3fd7f3c61cd0 "\n">, #<Nokogiri::XML::Element:0x3fd7f3c61b90 name="tr" 
children=[#<Nokogiri::XML::Element:0x3fd7f3c61960 name="td" 
children=[#<Nokogiri::XML::Text:0x3fd7f3c61708 "2">]>, 

我在我的數據庫有「肯德基」的team.name,所以我想針對肯塔基州的排名。我會怎麼做?

等級:1被發現在//*[@id="ratings-table"]/tbody[1]/tr[1]/td[1]

隊:肯塔基在//*[@id="ratings-table"]/tbody[1]/tr[1]/td[2]

發現/如何定位/找到「等級」通過搜索使用「肯德基」?我對其他一些專欄感興趣,但只有這個例子應該解釋其餘的一些。

謝謝!

+0

歡迎堆棧溢出。當請求幫助調試代碼時,我們期望樣本輸入,在您的情況下,這將是使用您的代碼所需的最小HTML。我們希望最小的代碼能夠展示您的問題。您正在顯示「檢查」輸出,這會減慢我們幫助您的能力。請查看與Nokogiri相關的其他問題,以瞭解如何提問以及您應該提供什麼。 –

回答

2

這是一個可能的XPath:

//*[@id="ratings-table"]/tbody/tr[contains(td[2],"Kentucky")]/td[1] 

中的XPath查找具有td[2]孩子包含"Kentucky"tr元素,然後返回相應的td[1]孩子。

或者,你可以檢查a孩子td[2]確切值找到目標行,然後目標列(td)元素返回:

//*[@id="ratings-table"]/tbody/tr[td[2]/a = "Kentucky"]/td[1] 
+0

謝謝。有沒有比包含更精確的方法?例如如果我搜索包含「密歇根州」,我想確保它得到密歇根州而不是密歇根州... – iamse7en

+0

謝謝!另外,你知道關於ruby/ror的一切嗎?我嘗試了'data.xpath(「// * [@ id =」ratings-table「]/tbody/tr [td [2]/a =」Kentucky「]/td [1]」)'並得到語法錯誤: ''' '語法錯誤:(IRB):54:語法錯誤,意想不到tIDENTIFIER,期望 ')'' ^ '(IRB):54:語法錯誤,意想不到tSTRING_BEG,keyword_do或' '(IRB期待):54:語法錯誤,意外tCONSTANT,期待輸入結束' – iamse7en

+1

我不知道ruby,但這是跨編程語言的常見問題:**衝突的字符串分隔符**。在XPath表達式中用雙引號替換雙引號:'doc.xpath(「// * [@ id ='ratings-table']/tbody/tr [td [2]/a ='Kentucky']/td [1 ]「)' – har07