#突然扫描returns一个空数组

#scan suddenly returns an empty array

我正在为来自 www.dev.to 的文章创建一个抓取工具,应该在文章的标题、作者和 body 中读取。我正在使用#scan 删除作者姓名后的白色 space 和其他字符。起初我假设作者姓名由名字和姓氏组成,然后意识到有些只列出了一个名字。现在我相应地更改了正则表达式,该方法停止工作并且#scan returns 一个空数组。我该如何解决这个问题?

  def scrape_post(path)
    url = "https://dev.to/#{path}"
    html_content = open(url).read
    doc = Nokogiri::HTML(html_content)
    doc.search('.article-wrapper').each do |element|
      title = element.search('.crayons-article__header__meta').search('h1').text.strip
      author_raw = element.search('.crayons-article__subheader').text.strip
      author = author_raw.scan(/\A\w+(\s|\w)\w+/).first
      body = doc.at_css('div#article-body').text.strip
      @post = Post.new(id: @next_id, path: path, title: title, author: author, body: body, read: false)
    end
    @post
  end

输入数据示例:

path = rahxuls/preventing-copying-text-in-a-webpage-4acg

预期输出:

title = "Preventing copying text in a webpage "

author_raw = "Rahul\n              \n\n              \n                  Nov  6\n\n\n                ・2 min read"

author = "Rahul"

来自scandocs.

如果模式不包含任何组,则每个单独的结果都由匹配的字符串 $& 组成。如果模式包含组,则每个单独的结果本身就是一个数组,每个组包含一个条目。

通过将括号添加到正则表达式的中间,您创建了一个捕获组。扫描将 return 该组捕获的任何内容。在您给出的示例中,它将是 'u'.

"Rahul\n \n\n \n Nov 6\n\n\n ・2 min read".scan(/\A\w+(\s|\w)\w+/) #=> [["u"]]

组可以标记为 non-capturing 到 return 到您的旧实现

"Rahul\n \n\n \n Nov 6\n\n\n ・2 min read".scan(/\A\w+(?:\s|\w)\w+/) #=> ["Rahul"]
#                                                       ^

或者您可以将命名的捕获组添加到您实际想要提取的内容中。

"Rahul\n \n\n \n Nov 6\n\n\n ・2 min read".match(/\A(?<name>\w+(\s|\w)\w+)/)[:name] #=> "Rahul"