如何使用BeautifulSoup刮擦Fidelity.com

时间:2019-08-16 14:42:31

标签: python web-scraping beautifulsoup

我正在尝试从此页面抓取股票代码:

https://quotes.fidelity.com/mmnet/SymLookup.phtml?reqforlookup=REQUESTFORLOOKUP&productid=mmnet&isLoggedIn=mmnet&rows=50&for=stock&by=cusip&criteria=294100102&submit=Search.

在页面响应中,我看到:

<tr><td height="20" nowrap=""><font class="smallfont">ENZO BIOCHEM ORD SHS</font></td>
            <td align="center" width="20%"><font><a href="/webxpress/get_quote?QUOTE_TYPE=&amp;SID_VALUE_ID=ENZ">ENZ</a></font></td>
            <td><font>&nbsp;</font></td>
             <td><font></font></td></tr>    
        </tbody></table></td></tr>

我只需要打印ENZ

我将如何使用BeautifulSoup做到这一点?另外,还有没有更简单的方法(看起来好像没有API,但是我可能错了)?

到目前为止,这是我的代码:

import requests
from bs4 import BeautifulSoup

base_url = "https://quotes.fidelity.com/mmnet/SymLookup.phtml?reqforlookup=REQUESTFORLOOKUP&productid=mmnet&isLoggedIn=mmnet&rows=50&for=stock&by=cusip&criteria="
cusip = "294100102"
url = base_url + cusip + "&submit=Search"

# Set Soup
headers = {'User-Agent': 'Mozilla/5.0'}
page = requests.get(url, headers=headers)
soup = BeautifulSoup(page.content, 'html.parser')

table = soup.find_all("table")[0]
rows = table.find_all("tr")

for row in rows:
    company = row.find_all("td", class_="smallfont")
    print(company)

1 个答案:

答案 0 :(得分:1)

只需使用font a即可作为CSS选择器。

import requests
from bs4 import BeautifulSoup as bs

r = requests.get('https://quotes.fidelity.com/mmnet/SymLookup.phtml?reqforlookup=REQUESTFORLOOKUP&productid=mmnet&isLoggedIn=mmnet&rows=50&for=stock&by=cusip&criteria=294100102&submit=Search')
soup = bs(r.content, 'lxml')
print(soup.select_one('font a').text)

另一种看似很健壮的方法是使用带有包含运算符的attribute = value选择器来定位a标签href

soup.select_one('[href*=SID_VALUE_ID]').text

在尝试访问.text之前,通常最好将匹配的元素设置为变量并测试None

例如,

var = soup.select_one('[href*=SID_VALUE_ID]')
if var is None:
    print('Not found')
else:
    print(var.text)