我希望匹配">
之后的任何单词。这是我的示例文本和要匹配的文本。
<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*')
^
我猜测原因是报价干扰了。
答案 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">