使用 Nokogiri 抓取 HTML table 并保存到数据库
Scraping HTML table with Nokogiri and saving to database
我一直在尝试抓取一个网站以获取教育信息以保存到我的应用程序数据库中。该站点有一个三列 table 如下:
<thead>
<tr height="20">
<th height="20" scope="col" width="91">UKPRN</th>
<th scope="col" width="87">INSTID</th>
<th scope="col" width="264">Name</th>
</tr>
</thead>
<tbody>
<tr height="20">
<td height="20">10000291</td>
<td>0047</td>
<td>Anglia Ruskin University</td>
</tr>
<tr height="20">
<td height="20">10007759</td>
<td>0108</td>
<td>Aston University</td>
</tr>
<tr height="20">
<td height="20">10000571</td>
<td>0048</td>
<td>Bath Spa University</td>
</tr>
<tr height="20">
<td height="20">10007850</td>
<td>0109</td>
<td>The University of Bath</td>
</tr>
<tr height="20">
<td height="20">10007152</td>
<td>0026</td>
<td>University of Bedfordshire</td>
</tr>
<tr height="20">
<td height="20">10007760</td>
<td>0127</td>
<td>Birkbeck College</td>
</tr>
<tr height="20">
<td height="20">10007140</td>
<td>0052</td>
<td>Birmingham City University</td>
</tr>
<tr height="20">
<td height="20">10006840</td>
<td>0110</td>
<td>The University of Birmingham</td>
</tr>
等等。我想分别在 UKPRN、instid 和 name 下获取保存到我的数据库中的 8 位数参考、4 位数参考和学校名称。
这是页面上唯一的 table,因此很容易获取。到目前为止,我在 irb 中的代码如下所示:
require 'nokogiri'
require 'open-uri'
page = Nokogiri::HTML(open(url))
rows = data.css("tr")
rows.each do |row|
name = row.css("td")[2]
ukprn = row.css("td")[0]
instid = row.css("td")[1]
end
这似乎工作正常,因为当我打印其中一个变量时,它似乎获得了正确的数据,但我无法摆脱文本周围的标签,一旦完成,我不确定我将如何将这些数据保存到数据库中的 institute
模型中。属性应与上面给出的名称相关联。感谢任何帮助。
.content
应该只为您提供所选块内的内容
尝试name = row.css("td")[2].content
像这样
rows = html.css("tbody tr")
rows.each do |row|
ukprn, instid, name = row.css('td').map(&:content)
Institute.create!(ukprn: ukprn, instid: instid, name: name)
end
我只拿了 tbody
中的 tr
我一直在尝试抓取一个网站以获取教育信息以保存到我的应用程序数据库中。该站点有一个三列 table 如下:
<thead>
<tr height="20">
<th height="20" scope="col" width="91">UKPRN</th>
<th scope="col" width="87">INSTID</th>
<th scope="col" width="264">Name</th>
</tr>
</thead>
<tbody>
<tr height="20">
<td height="20">10000291</td>
<td>0047</td>
<td>Anglia Ruskin University</td>
</tr>
<tr height="20">
<td height="20">10007759</td>
<td>0108</td>
<td>Aston University</td>
</tr>
<tr height="20">
<td height="20">10000571</td>
<td>0048</td>
<td>Bath Spa University</td>
</tr>
<tr height="20">
<td height="20">10007850</td>
<td>0109</td>
<td>The University of Bath</td>
</tr>
<tr height="20">
<td height="20">10007152</td>
<td>0026</td>
<td>University of Bedfordshire</td>
</tr>
<tr height="20">
<td height="20">10007760</td>
<td>0127</td>
<td>Birkbeck College</td>
</tr>
<tr height="20">
<td height="20">10007140</td>
<td>0052</td>
<td>Birmingham City University</td>
</tr>
<tr height="20">
<td height="20">10006840</td>
<td>0110</td>
<td>The University of Birmingham</td>
</tr>
等等。我想分别在 UKPRN、instid 和 name 下获取保存到我的数据库中的 8 位数参考、4 位数参考和学校名称。
这是页面上唯一的 table,因此很容易获取。到目前为止,我在 irb 中的代码如下所示:
require 'nokogiri'
require 'open-uri'
page = Nokogiri::HTML(open(url))
rows = data.css("tr")
rows.each do |row|
name = row.css("td")[2]
ukprn = row.css("td")[0]
instid = row.css("td")[1]
end
这似乎工作正常,因为当我打印其中一个变量时,它似乎获得了正确的数据,但我无法摆脱文本周围的标签,一旦完成,我不确定我将如何将这些数据保存到数据库中的 institute
模型中。属性应与上面给出的名称相关联。感谢任何帮助。
.content
应该只为您提供所选块内的内容
尝试name = row.css("td")[2].content
像这样
rows = html.css("tbody tr")
rows.each do |row|
ukprn, instid, name = row.css('td').map(&:content)
Institute.create!(ukprn: ukprn, instid: instid, name: name)
end
我只拿了 tbody
tr