#突然扫描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"
来自scan
docs.
如果模式不包含任何组,则每个单独的结果都由匹配的字符串 $& 组成。如果模式包含组,则每个单独的结果本身就是一个数组,每个组包含一个条目。
通过将括号添加到正则表达式的中间,您创建了一个捕获组。扫描将 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"
我正在为来自 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"
来自scan
docs.
如果模式不包含任何组,则每个单独的结果都由匹配的字符串 $& 组成。如果模式包含组,则每个单独的结果本身就是一个数组,每个组包含一个条目。
通过将括号添加到正则表达式的中间,您创建了一个捕获组。扫描将 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"