在 Nokogiri 中选择变体
Selecting variations in Nokogiri
我正在抓取这两个网站:
- https://www.library.uq.edu.au/uqlsm/availablepcsembed.php?branch=Law
- https://www.library.uq.edu.au/uqlsm/availablepcsembed.php?branch=BSL。
不幸的是,它们有变体。一个在 href
标签内有级别名称(例如 Level 2),而另一个只是纯文本。我如何 select 一个或另一个取决于那里有哪一个?
我试过了,没用:
level.css(/"a[href]"|".left"/).text
以下是 2 HTML 部分的简化版本:
<table class="chart">
<tr valign="middle">
<td class="left">Level 2</td> <!-- the problem -->
<td class="middle"><div style="width:86%;"><strong>86%</strong></div></td>
</tr>
</table>
<table class="chart">
<tr valign="middle">
<td class="left"><a href="availablepcsembed.php?branch=BSL&room=Lvl1">Level 1</a></td>
<td class="middle"><div style="width:32%;"><strong>32%</strong></div></td>
</tr>
</table>
我的代码(从代码部分编辑到整个方法)
def self.scrape_details_page(library_url)
details_page = Nokogiri::HTML(open(library_url))
details_page.css("table.chart tr").collect do |level|
right = level.css(".right").text.split
{level: level.css("a[href]").text, available: right[0], out_of_available: right[3]}
end
end
如果您想做的是获取最里面 div 内的文本,您应该能够 dive 一直向下调用 #text
已解析的 td
元素。无需考虑和走动可能存在于内部的额外标签,例如link 标签。鉴于您编写的代码:
details_page.css("table.chart tr").collect do |level|
level = level.text
end
对于每个元素,这会将级别标签或百分比值(内部文本)作为字符串提取并将该值分配给级别变量。
编辑:此外,如果您只关心获取级别标签,则只需预先按 class 过滤元素:
details_page.css("table.chart tr td.left").collect do |level|
level = level.text
end
感谢@jk_ 的启发,我使用 .css(".left").text
修复了它。这只是选择 tr
.
左侧 td
中的所有文本
工作代码:
def self.scrape_details_page(library_url)
details_page = Nokogiri::HTML(open(library_url))
details_page.css("table.chart tr").collect do |level|
right = level.css(".right").text.split
{level: level.css(".left").text, available: right[0], out_of_available: right[3]}
end
end
应该适用于这种特殊情况。
在更一般的情况下,如果您要使用 CSS 选择器,则需要对 "or"(逗号)使用 CSS 语法。所以如果你打算使用你最初询问的选择器,它会是
level.css('a[href], .left').text
我正在抓取这两个网站:
- https://www.library.uq.edu.au/uqlsm/availablepcsembed.php?branch=Law
- https://www.library.uq.edu.au/uqlsm/availablepcsembed.php?branch=BSL。
不幸的是,它们有变体。一个在 href
标签内有级别名称(例如 Level 2),而另一个只是纯文本。我如何 select 一个或另一个取决于那里有哪一个?
我试过了,没用:
level.css(/"a[href]"|".left"/).text
以下是 2 HTML 部分的简化版本:
<table class="chart">
<tr valign="middle">
<td class="left">Level 2</td> <!-- the problem -->
<td class="middle"><div style="width:86%;"><strong>86%</strong></div></td>
</tr>
</table>
<table class="chart">
<tr valign="middle">
<td class="left"><a href="availablepcsembed.php?branch=BSL&room=Lvl1">Level 1</a></td>
<td class="middle"><div style="width:32%;"><strong>32%</strong></div></td>
</tr>
</table>
我的代码(从代码部分编辑到整个方法)
def self.scrape_details_page(library_url)
details_page = Nokogiri::HTML(open(library_url))
details_page.css("table.chart tr").collect do |level|
right = level.css(".right").text.split
{level: level.css("a[href]").text, available: right[0], out_of_available: right[3]}
end
end
如果您想做的是获取最里面 div 内的文本,您应该能够 dive 一直向下调用 #text
已解析的 td
元素。无需考虑和走动可能存在于内部的额外标签,例如link 标签。鉴于您编写的代码:
details_page.css("table.chart tr").collect do |level|
level = level.text
end
对于每个元素,这会将级别标签或百分比值(内部文本)作为字符串提取并将该值分配给级别变量。
编辑:此外,如果您只关心获取级别标签,则只需预先按 class 过滤元素:
details_page.css("table.chart tr td.left").collect do |level|
level = level.text
end
感谢@jk_ 的启发,我使用 .css(".left").text
修复了它。这只是选择 tr
.
td
中的所有文本
工作代码:
def self.scrape_details_page(library_url)
details_page = Nokogiri::HTML(open(library_url))
details_page.css("table.chart tr").collect do |level|
right = level.css(".right").text.split
{level: level.css(".left").text, available: right[0], out_of_available: right[3]}
end
end
在更一般的情况下,如果您要使用 CSS 选择器,则需要对 "or"(逗号)使用 CSS 语法。所以如果你打算使用你最初询问的选择器,它会是
level.css('a[href], .left').text