2017-10-29 152 views
0

选择的变化,我刮这两个网站:在引入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标记内具有级别名称(例如级别2),而另一个只是纯文本。我如何选择一个或另一个取决于哪一个?

我想这无济于事:

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 

回答

0

多亏了我的灵感固定它使用.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 
2

如果你想要做的就是抢在最里面的div中的文字,你应该能够下潜所有通过在解析的td元素上调用#text来降低方式。不需要考虑和走路可能存在于其内的额外标签,例如链接标签。鉴于你的代码写的:

details_page.css("table.chart tr").collect do |level| 
    level = level.text 
end 

对于每一个元素,这将拉动水平标签或百分比值(内部文本)作为一个字符串,并赋值给变量的水平。

编辑:另外,如果您关心越来越级别的标签,你可以通过过滤类的元素前面:从@jk_

details_page.css("table.chart tr td.left").collect do |level| 
    level = level.text 
end 
+0

我修复了我的原始帖子以反映完整的方法,因此更易于理解。 ''\ r \ n“+”Level 1 \ r \ n“+”42%\ r \ n“+”13使用'.text'可以正常工作,但是很难在看到它时返回: 31个电脑的\ r \ n“+”“'。我的答案在下面使用'.css(“。left”).text',并且似乎正好选择了我需要的东西。谢谢。 –

1

answer by jk_应该在这个特殊的情况下工作。

在更一般的情况下,如果您打算使用CSS选择器,则需要对“或”(逗号)使用CSS语法。因此,如果您打算使用您最初询问的选择器,它会是

level.css('a[href], .left').text 
+0

有没有办法做一个或另一个?这正是我所寻找的,除了选择两者之外,我希望它能够根据找到的两个选择其中的一个。 –

+0

你将找回所有匹配任何一个的元素。在你的情况下,第二种格式有'a [href]'和'.left'的例子。所以你必须选择不同的选择器(就像使用'.left'的jk_的答案一样)或者决定使用哪个元素。如果你只想要第一个元素,你可以使用'.at_css'。 – Max