2017-01-23 36 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文档中。 –

相关问题