BeautifulSoup4使用包含非alpha数字的子字符串查找或选择字符串开头

时间:2017-01-23 08:56:53

标签: python web-scraping beautifulsoup

我正在使用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现在可能已经很久了,但是这就是我习惯的,我需要修补现有的脚本。

3 个答案:

答案 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\)'))

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>

答案 2 :(得分:0)

试试这个: elem = soup.find(&#39; span&#39;,class_ = re.compile(r&#39; ^ Fw \(b \)Fz \(36px \)Mb \( - 4px \)&#39;) )