我正在使用BeautifulSoup4来抓取包含以下感兴趣元素的页面:
<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现在可能已经很久了,但是这就是我习惯的,我需要修补现有的脚本。
答案 0 :(得分:1)
<table class="table">
<thead>
<tr> <th>Outlets</th>
</tr>
</thead>
<tbody>
<tr data-ng-repeat="outlet in Outlets">
<td><a >{{outlet.PartnerName}}</a></td>
</tr>
</tbody>
</table>
相当于拥有多个类。你可以尝试这样:
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
答案 1 :(得分: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\)'))
注意值中的""
:
如果传入正则表达式对象,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>
答案 2 :(得分:0)
试试这个: elem = soup.find(&#39; span&#39;,class_ = re.compile(r&#39; ^ Fw \(b \)Fz \(36px \)Mb \( - 4px \)&#39;) )