使用beautifulsoup从下拉菜单中进行抓取

2024-10-03 23:26:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我正试图从以下位置抓取日期列表:https://ca.finance.yahoo.com/quote/AAPL/options

日期位于选项链正上方的下拉菜单中。我以前从这个网站上抓取过文本,但是这个文本使用了“选择”选项选项的语法。如何调整代码以收集此类文本?我已经使用了下面代码的许多变体来尝试和刮文本,但我没有运气

多谢各位

    import bs4
    import requests

    datesLink = ('https://ca.finance.yahoo.com/quote/AAPL/options')
    datesPage = requests.get(datesLink)
    datesSoup = BeautifulSoup(datesPage.text, 'lxml')

    datesQuote = datesSoup.find('div', {'class': 'Cf Pt(18px)controls'}).find('option').text

Tags: 代码https文本importcom选项requestsyahoo
2条回答

您只需将HTML直接读取到熊猫:


import pandas as pd
URI = 'https://ca.finance.yahoo.com/quote/AAPL/options'

df = pd.read_html(URI)[0] #[1] depending on the table you wish for

您无法提取此下拉列表的原因是,此列表是动态生成的,最简单的方法是将html内容保存到文件中,并在文本编辑器中手动查看

但是,您可以使用一些丑陋的正则表达式从脚本源代码中解析这些日期,这些代码位于同一个html文件中。例如,这似乎有效:

import requests, re
from datetime import *

content = requests.get('https://ca.finance.yahoo.com/quote/AAPL/options').content.decode()
match = re.search(r'"OptionContractsStore".*?"expirationDates".*?\[(.*?)\]', content)
dates = [datetime.fromtimestamp(int(x), tz=timezone.utc) for x in match.group(1).split(',')]

for d in dates:
    print(d.strftime('%Y-%m-%d'))

很明显,以如此恶劣的方式解析东西并不是万无一失的,而且很可能很快就会崩溃。但是,对于任何类型的网络抓取,也可以这样说

相关问题 更多 >