【问题标题】:Cleaning scraped <a href> rails清洁刮擦的 <a href> 导轨
【发布时间】:2016-06-23 11:40:26
【问题描述】:

我已经从一个网站上抓取数据并使用下面的代码将其输入到一个数组中:

  def process_course_details(course_details)
        details_array =[]
        details_link = true 
        entry_link = true

                details_info = {}
                # Sets all data in hash
                details_info[:url] = clean_link(course_details.search('div.coursedetails_programmeurl a'))
                details_array.push(details_info)
                print_details_info(details_info)


             entry_link = course_details.search('ul.details_tabs').first

     end

上面的代码存储了被拉取的元素:

<a href="http://www.abdn.ac.uk/study/courses/undergraduate/C8R1/">View course details on provider's website</a>

但我想把上面清理到下面:

http://www.abdn.ac.uk/study/courses/undergraduate/C8R1/

或未能删除撇号并具有以下内容:

<a href="http://www.abdn.ac.uk/study/courses/undergraduate/C8R1/">View course details on providers website</a>`

【问题讨论】:

  • “我正在尝试将其存储在 sqlite3 数据库中,但由于文本中有撇号,我不能这样做” – 我很确定 SQLite 可以存储撇号。您存储文本的代码是什么样的?
  • 您正在使用任何宝石进行报废?
  • 在存储其他数据时,我已经抓取到数据库中,撇号提供了错误并停止了它。一旦我清理了撇号并且它不再是数组的一部分,代码就会起作用并创建表。 db = SQLite3::Database.open('ahhh.sqlite3') db.execute "INSERT INTO aahah (uname, cname, duration,qualification, url, entry) VALUES ('#{@uni_name}', #{@course_name} ', '#{@course_duration}', '#{@course_qual}', '#{@details_entry}', '#{@requirements}')" 如果你说的是我可以发布的数组
  • 我正在使用机械化进行抓取,这也需要/使用 nokogiri。

标签: ruby-on-rails ruby sqlite gsub code-cleanup


【解决方案1】:

您可以像这样使用 Nokogiri 提取 href:

html = Nokogiri::HTML('<a href="http://www.abdn.ac.uk/study/courses/undergraduate/C8R1/">View course details on provider\'s website</a>')
html.xpath("//a/@href").to_s # => "http://www.abdn.ac.uk/study/courses/undergraduate/C8R1/"

【讨论】:

  • 我正在提取其中几个(可能是几千个)这些 a href,所以我不太确定如何在比你所举的例子更大的范围内实施你的建议提供。
  • 好吧,你没有提到这个问题,所以没有人知道你如何保留这几千个href。如果是数组,就做一个循环。
  • 代码很多,如果我全部包含在内,问题会太长。我想要做的就是创建一个 gsub 方法,该方法能够将 a href 清理为它在数组中存储的(显示在问题中)。如果您有时间提供帮助并需要更多信息,我可以通过电子邮件向您发送更深入的代码。我对此很陌生。
  • 我在问题的任何地方都看不到数组。你的方法接受text,ruby 中没有这样的类。你说你得到了未定义的方法 gsub!,你不能得到这个字符串错误,这意味着你没有传递一个字符串而是其他东西,但是你在最重要的部分切断了错误消息。请使用变量的现有结构示例编辑您的问题,您要传递什么以及您要如何转换。我目前在问题中看到的是“html 我想将其清理为 link
  • 我已更新问题以包含创建数组的段
【解决方案2】:

基于your comment:

在存储其他数据时,我已将撇号刮入数据库 提供错误并停止它。一旦我清理了撇号和 它不再是代码工作的数组的一部分,并且表格是 已创建。

db = SQLite3::Database.open('ahhh.sqlite3')
db.execute "INSERT INTO aahah (uname, cname, duration, qualification, url, entry) VALUES ('#{@uni_name}', #{@course_name}', '#{@course_duration}', '#{@course_qual}', '#{@details_entry}', '#{@requirements}')"

您正在通过字符串插值插入值:

db.execute("INSERT INTO table_name (foo, bar) VALUES ('#{@foo}', '#{@bar}')")

显然,如果插值字符串包含撇号,您的 SQL 字符串可能会变得无效。更糟糕的是,这段代码容易出现SQL injection

您应该使用参数标记并让 SQLite gem 处理转义:

db.execute("INSERT INTO table_name (foo, bar) VALUES (?, ?)", [@foo, @bar])

这使您可以安全地插入撇号和其他特殊字符。

【讨论】:

  • 我运行了你的建议,它返回了这个错误:bind_param': can't prepare Nokogiri::XML::Element (RuntimeError)
  • @Akamaru 我的建议不包含任何与 Nokogiri 相关的代码。
猜你喜欢
  • 1970-01-01
  • 2023-03-18
  • 2011-12-15
  • 2018-04-18
  • 1970-01-01
  • 1970-01-01
  • 2021-11-07
  • 2018-09-08
  • 1970-01-01
相关资源
最近更新 更多