0

如何搜索包含Click Here to Enter a New Passwordusing的元素Nokigiri::HTML

我的 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 代码中添加任何空格。

4

4 回答 4

2

您要搜索的大部分文本都在a元素之外。

你能做的最好的可能是:

a = doc.search('a[text()="Click Here"]').find{|a| a.next.text[/to Enter a New Password/]}
于 2013-05-30T10:16:38.513 回答
1

您可以混合使用 xpath 和正则表达式,但由于matchesnokogiri 的 xpath 中还没有,您可以按如下方式实现自己的:

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
于 2013-05-30T11:03:40.343 回答
0

您可以尝试使用 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.

有一篇关于Parsing HTML with Nokogiri的好文章

于 2013-05-30T09:29:12.313 回答
0

你很亲密。以下是查找文本的包含元素的方法:

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.
于 2013-05-31T15:45:55.547 回答