-1

我想匹配后面的任何单词">。这是我的示例文本,以及要匹配的文本。

<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*')
      ^

我猜原因是引号干扰。

4

2 回答 2

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>s 中,但 Nokogiri 不会。您可能需要调整 XPath 以匹配您正在抓取的 HTML 的真实结构。

于 2013-08-27T05:01:55.777 回答
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"> 
于 2013-08-27T04:58:57.657 回答