2017-10-29 196 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