【问题标题】:Selecting precise data through Nokogiri通过 Nokogiri 选择精确的数据
【发布时间】:2015-09-13 00:41:40
【问题描述】:

我的数据库中有一份大学篮球队的名单。这些名称与我试图解析的站点上的名称完全匹配。网站是一张大桌子。我想根据我数据库中的那些团队选择/匹配特定的单元格。如果是 css 或 xpath 选择方法,我没有偏好。什么都行。这是返回的一个小示例(添加了一些换行符以用于视觉目的):

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">]>,

我的数据库中有一个名为“Kentucky”的 team.name,所以我想定位 Kentucky 的排名。我该怎么做?

排名:1 在//*[@id="ratings-table"]/tbody[1]/tr[1]/td[1]找到

团队:肯塔基州位于//*[@id="ratings-table"]/tbody[1]/tr[1]/td[2]

如何通过搜索/使用“肯塔基州”来定位/找到“排名”?我对其他一些专栏感兴趣,但仅此一个示例即可解释其余部分。

谢谢!

【问题讨论】:

  • 欢迎来到 Stack Overflow。在寻求帮助调试代码时,我们期望输入示例,在您的情况下,这将是使用您的代码所需的最少 HTML。我们希望用最少的代码来演示您的问题。您正在显示 inspect 输出,这会减慢我们为您提供帮助的能力。请查看与 Nokogiri 相关的其他问题,以了解如何提问以及应该提供什么。

标签: ruby-on-rails ruby xpath nokogiri


【解决方案1】:

这是一种可能的 XPath:

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

XPath 查找具有td[2] 子元素的tr 元素包含 字词"Kentucky",然后返回对应的td[1] 子元素。

或者,您可以检查td[2] 的子元素a精确 值以找到目标行,然后返回目标列 (td) 元素:

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

【讨论】:

  • 谢谢。有没有比包含更准确的方法?例如如果我搜索包含“密歇根州”,我想确保它得到密歇根州而不是密歇根州......
  • 谢谢!另外,你对 ruby​​/ror 有什么了解吗?我试过data.xpath("//*[@id="ratings-table"]/tbody/tr[td[2]/a = "Kentucky"]/td[1]") 并得到语法错误:``` SyntaxError: (irb):54: syntax error, unexpected tIDENTIFIER, expecting ')' ^ (irb):54: syntax error, unexpected tSTRING_BEG, expecting keyword_do or (irb):54: syntax error, unexpected tCONSTANT, expecting end-of-input
  • 我不懂 ruby​​,但这是跨编程语言的一个常见问题:冲突的字符串分隔符。在 XPath 表达式中用单引号替换双引号:doc.xpath("//*[@id='ratings-table']/tbody/tr[td[2]/a = 'Kentucky']/td[1]")
猜你喜欢
  • 2018-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-15
  • 1970-01-01
  • 2019-02-17
  • 1970-01-01
  • 2018-10-27
相关资源
最近更新 更多