2015-09-12 2 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, необходимым для работы с вашим кодом. Мы ожидаем, что минимальный код продемонстрирует ваш вопрос. Вы показываете вывод 'inspect', который замедляет нашу способность помочь вам. Просмотрите другие вопросы, связанные с Nokogiri, чтобы получить представление о том, как спросить и что вам следует предоставить. –

ответ

2

Это один из возможных XPath:

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

XPath ищет tr элемент, имеющий td[2] ребенка содержит слово "Kentucky", а затем возвращают соответствующий 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] ")' и получил синтаксические ошибки: '' ' ' SyntaxError: (IRB): 54: ошибка синтаксиса, неожиданный tIDENTIFIER, ожидая ')' ' ^ ' (IRB): 54: ошибка синтаксиса, неожиданный tSTRING_BEG, ожидая keyword_do или ' ' (IRB): 54: синтаксическая ошибка, неожиданный tCONSTANT, ожидающий конец ввода' – iamse7en

+1

Я не знаю рубина, но это общая проблема на всех языках программирования: ** противоречивый разделитель строк **. Замените двойные кавычки одиночными кавычками в выражении XPath: 'doc.xpath (" // * [@ id = 'ratings-table']/tbody/tr [td [2]/a = 'Kentucky']/td [1 ] ")' – har07

Смежные вопросы