2017-01-23 37 views
-1

我使用BeautifulSoup4刮包含關注以下元素的頁面:BeautifulSoup4發現或選擇串子begining包含非字母數字

<span class="Fw(b) Fz(36px) Mb(-4px)" data-reactid="279">170.55</span> 

我曾嘗試以下,其中沒有工作

from bs4 import BeautifulSoup 
import re 

soup = Beautiful(fetch_page_html()) 

#Attempt 1 
elem = soup.select("span[class^=Fw(b) Fz(36px) Mb(-4px)]") 

#Attempt 2 
elem = soup.find('span', class_=re.compile(r'^<span class="Fw(b) Fz(36px) Mb(-4px)')) 

我在做什麼錯?

[附錄]

請,不建議我使用的,因爲XYZ的另一個刮刀庫,這不是我問這裏有什麼,我知道還有其他的拼搶庫在那裏,而bs4現在可能在牙齒上變得漫長,但這是我習慣的,我需要修補現有的腳本。

回答

1

class="c1 c2 c3"相當於有多個類。你可以嘗試這樣的:

from bs4 import BeautifulSoup as bsp 
import requests 

res = requests.get("http://finance.yahoo.com/quote/IBM/options?p=IBM&straddle=false&date=1486080000").content 
soup = bsp(res, 'lxml') 
l = soup.select('div.D(ib).Fw(200).Mend(20px) span.Mb(-4px).Fw(b).Fz(36px)')[0] 
print l.text 

輸出:

170.55 
+0

不幸的是沒有。它返回一個空列表。我開始認爲BS4已經過時了。開始看Scrapy - DESPITE我在OP中說過的話。 –

+0

@HomunculusReticulli如果您可以提供鏈接,可以對其進行測試。 – MYGz

+0

這裏是[鏈接](http://finance.yahoo.com/quote/IBM/options?p=IBM&straddle=false&date=1486080000)。我試圖拿取** 170.55 **的價格(因爲它發生,也是時間戳**美國東岸時間下午4:00) - 但這可能是另一個問題)。 –

0
elem = soup.select("span[class^='Fw(b) Fz(36px) Mb(-4px)']") 

elem = soup.find('span', class_=re.compile(r'^Fw\(b\) Fz\(36px\) Mb\(-4px\)')) 

CSS Selectors

諾蒂奇中的值""

enter image description here

regular expression

如果您傳入正則表達式對象,Beautiful Soup將使用其search()方法對該正則表達式進行過濾。

import bs4 

html = '<span class="Fw(b) Fz(36px) Mb(-4px)" data-reactid="279">170.55</span>' 

soup = bs4.BeautifulSoup(html, 'lxml') 

sel = soup.select("span[class^='Fw(b) Fz(36px) Mb(-4px)']") 

reg = soup.find('span', class_=re.compile(r'^Fw\(b\) Fz\(36px\) Mb\(-4px\)')) 

出:

<span class="Fw(b) Fz(36px) Mb(-4px)" data-reactid="279">170.55</span> 
<span class="Fw(b) Fz(36px) Mb(-4px)" data-reactid="279">170.55</span> 
+0

有了第一個,我得到'ValueError異常:不支持或無效的CSS選擇器: 「跨度[類^ ='FW(二)」'第二個,elem是'None'。順便說一句,我在Python 3.5中運行這個,我不知道這是否有所作爲。 –

+0

@Homunculus Reticulli最後錯過一個''' –

+0

嘗試使用更長的html字符串,其中包含我正在尋找的範圍 - 我想你會發現你的代碼不起作用。 –

0

嘗試這種情況: ELEM = soup.find( '跨度',class_ = re.compile(R'^ FW \(B \)Fz的\(36px \ )Mb \( - 4px \)'))

+0

elem是'None'。我認爲你必須用我期待的範圍來測試這個,它隱藏在一個更大的HTML文檔中。 –

相關問題