2017-05-28 44 views
1

我的第一次在SO上。感謝幫助我們這麼長時間的菜鳥。即將直奔點:beautifulsoup CSS選擇 - 找到一個特定的屬性(樣式爲前)不存在的標籤

情景: 我在現有的程序正在讀取CSS選擇器從一個配置文件中的字符串,使程序的動態,並能夠通過只改變配置放棄任何現場工作CSS選擇器的值。

問題: 我試圖刮掉其渲染的項目,如下面的兩個選項一個網站:

選項1:

......... 
<div class="price"> 
    <span class="price" style="color:red;margin-right:0.1in"> 
    <del>$299</del> 
    </span> 
    <span class="price"> 
    $195 
    </span> 
</div> 

soup = soup.select("span.price") - this doesn't work as I need second span tag or last span tag :(

選項2:

......... 
<div class="price"> 
    <span class="price"> 
    $199 
    </span> 
</div> 

soup = soup.select("span.price") - this works great! 

問題: 在上面的op tions我希望能夠獲得最後一個span標籤(195美元或199美元),並且不在乎299美元。基本上我只是想提取最終的銷售價格而不是原價。

所以2點的方法,我知道,截至目前有:

1)總能獲得最後的跨度標籤 2)總是得到不具有style屬性

現在span標記,我知道不是運營商,最後一類是不存在於bs4(只有nth-type型可用),所以我卡在這裏。任何建議都有幫助。由於這是一個現有的程序,我不能使用soup.find_all()或除soup.select()以外的任何其他方法。對不起:(

感謝

+0

我不明白你到底需要,但你可以使用顯示無德爾 {{{跨越德爾{顯示:無; ) –

+0

這本書說最後一類是可用的:https://books.google.nl/books?id=mEu7DQAAQBAJ&pg=PA6&lpg=PA6&dq=bootstrap+4+last-of-type&source=bl&ots=zUmAMxCMG-&sig=kCjR8TivvajvtMlf -gOE5lABA2w&hl = zh-CN&sa = X&ved = 0ahUKEwjUuMrdlJLUAhWOY1AKHQT1AvIQ6AEIVTAH#v = onepage&q = bootstrap%204%20last-of-type&f = false – Gerard

+0

您能分享網址嗎?其他嘗試soup.select(「span。價格「,{'風格':無}) – Gahan

回答

1

可以爲span標籤搜索,而不樣式屬性:。

prices = soup.select('span.price') 
no_style = [price for price in prices if 'style' not in price.attrs] 
>> [<span class="price">$199</span>] 
+0

Thanks Gil。但是因爲我正在調用一個現有的程序,它只是調用soup.select方法,因此不能在沒有檢修整個程序的情況下使用這種方法。 –

+0

確定,我已經編輯了使用soup.select方法的代碼,它仍然可以工作,這有幫助嗎? –

+0

再次感謝Gil。我應該提到我只使用一個字符串它將在soup.select()方法中傳遞。如果我要爲該程序添加任何附加代碼,那麼我需要進行全面的測試,並且我還可以在通用基礎上使此程序更加靈活。 –

0

這可能是使用功能的好時機。在這種情況下BeautifulSoup給每個span_with_style標籤,並且該功能測試標籤的name是否爲span並且它具有屬性style。如果是,則BeautifulSoup將該標籤附加到其結果列表中。

HTML = '''\ 
<div class='price'> 
    <span class='price' style='color: red; margin-right: 0.1in'> 
     <del>$299</del> 
    </span> 
    <span class='price'> 
     $195 
    </span> 
</div>''' 
from bs4 import BeautifulSoup 
soup = BeautifulSoup(HTML, 'lxml') 

for item in soup.find_all(lambda tag: tag.name=='span' and tag.has_attr('style')): 
    print (item) 
+0

謝謝比爾。然而,這是一個很好的解決方案,因爲我正在改變一個只調用soup.select的現有程序(中的一些字符串)。我不能在沒有檢修整個程序的情況下調用該函數:( –

+0

現在查看 - –

0

select函數中的代碼需要更改爲:

def select(soup, the_variable_you_pass): 
    soup.find('div', attrs={'class': 'price'}).find_all(the_variable_you_pass)[-1] 
相關問題