匹配方法的语法问题

时间:2013-08-27 04:47:42

标签: ruby regex nokogiri match

我希望匹配">之后的任何单词。这是我的示例文本和要匹配的文本。

<a href="http://www.foo.bar">example_text (a)</a>

要抓取的文字:

example_text

这是我的代码:

$page_html = Nokogiri::HTML.parse($browser.html)
$holder = $page_html.xpath('/html/body/div[2]/div[5]/div/table/tbody/tr[4]/td/a')
$user = $holder.match('(?<=\"\>)\w*')

我的错误:

syntax error, unexpected tIDENTIFIER, expecting keyword_end
$user = $holder.match('(?<=\"\>)\w*')
      ^

我猜测原因是报价干扰了。

2 个答案:

答案 0 :(得分:2)

你的“意外的tIDENTIFIER”错误来自其他地方,你应该得到一个

undefined method `match' for #<Nokogiri::XML::NodeSet:...>

错误,因为xpath为您提供Nokogiri::XML::NodeSet,而且没有match方法。

您的XPath表达式似乎唯一标识您所追求的单个<a>,因此您应该使用at获取节点,然后使用text来提取内容:

text = $page_html.at(...).text

然后你可以简单地split取消第一个单词:

user = text.split.first

此外,您还需要小心XPath:

/html/body/div[2]/div[5]/div/table/tbody/tr[4]/td/a

看起来它来自浏览器,有些浏览器会将<tbody>个元素插入<table>,但Nokogiri不会。您可能需要调整XPath以匹配您正在抓取的HTML的真实结构。

答案 1 :(得分:1)

您必须在源代码中的某个位置错过结束括号。当它说你错过了关键字end时,这意味着什么。

2.0.0p0 :004 > $holder = '<a href="http://www.foo.bar">example_text (a)</a>'
 => "<a href=\"http://www.foo.bar\">example_text (a)</a>" 
2.0.0p0 :005 > $user = $holder.match('(?<=\"\>)\w*')
 => #<MatchData "example_text">