如何使用Nokigiri::HTML
搜索包含Click Here to Enter a New Password
的元素?
我的HTML结构是:
<table border="0" cellpadding="20" cellspacing="0" width="100%">
<tbody>
<tr>
<td class="bodyContent" valign="top">
<div>
<strong>Welcome to</strong>
<h2 style="margin-top:0">OddZ</h2>
<a href="http://mandrillapp.com/track/click.php?...">Click Here</a>
to Enter a New Password
<p>
Click this link to enter a new Password. This link will expire within 24 hours, so don't delay.
<br>
</p>
</div>
</td>
</tr>
</tbody>
</table>
我试着:
doc = (Nokogiri::HTML(@inbox_emails.first.body.raw_source))
password_container = doc.search "[text()*='Click Here to Enter a New Password']"
,但没有找到结果。当我尝试:
password_container = doc.search "[text()*='Click Here']"
我没有得到结果。
我想搜索完整的文本。
我发现在文本" to Enter a New Password"
之前有很多空格,但我没有在HTML代码中添加任何空格。
您正在搜索的大部分文本都在a
元素之外。
你能做的最好的可能是:
a = doc.search('a[text()="Click Here"]').find{|a| a.next.text[/to Enter a New Password/]}
您可以混合使用xpath和regex,但由于nokogiri的xpath中还没有matches
,因此您可以自己实现,如下所示:
class RegexHelper
def content_matches_regex node_set, regex_string
! node_set.select { |node| node.content =~ /#{regex_string}/mi }.empty?
end
def content_matches node_set, string
content_matches_regex node_set, string.gsub(/s+/, ".*?")
end
end
search_string = "Click Here to Enter a New Password"
matched_nodes = doc.xpath "//*[content_matches(., '#{search_string}')]", RegexHelper.new
你可以尝试使用CSS选择器。我把你的HTML保存为一个名为test.html
require 'Nokogiri'
@doc = Nokogiri::HTML(open('test.html'))
puts @result = @doc.css('p').text.gsub(/n/,'')
返回
Click this link to enter a new Password. This link will expire within 24 hours, so don't delay.
有一篇关于Nokogiri解析HTML的好文章
你差一点。下面是查找包含文本的元素的方法:
doc.search('*[text()*="Click Here"]')
这给了你<a>
标签。这是你想要的吗?如果您确实想要<a>
的父元素,也就是包含<div>
的元素,您可以这样修改它:
doc.search('//*[text()="Click Here"]/..').text
选择包含<div>
,其文本为:
Welcome to
OddZ
Click Here
to Enter a New Password
Click this link to enter a new Password. This link will expire within 24 hours, so don't delay.