在 Nokogiri 中选择变体

Selecting variations in Nokogiri

我正在抓取这两个网站:

  1. https://www.library.uq.edu.au/uqlsm/availablepcsembed.php?branch=Law
  2. 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