Python-BS4-从一个类中提取多个值

时间:2019-01-04 15:49:37

标签: python-3.x beautifulsoup

使用bs4解析网页时,我试图提取多个值并将其存储在字典中以备后用。

                型号

            <div class="model-dropdown-block">
                <select name="modelpid">
                    <option value="empty">Select Model</option>

                    <option value="MODEL1_530"
                            data-maxavailable="0.0"
                            data-maxorderqty="10"
                           data-status="NOT_AVAILABLE">                                
                           Jet Fighter       </option>


                        <option value="MODEL2_540"
                            data-maxavailable="0.0"
                            data-maxorderqty="10"
                            data-status="NOT_AVAILABLE">                                
                            Jet Fighter2     </option>

鉴于以上已解析的内容,我想提取:

  1. 相关文字(Jet Fighter)
  2. 选项值(MODEL1_530)
  3. 数据状态(不可用)

并将它们插入具有多个值的字典键/值对中,以使结果为 Jet Fighter:Model1530,不可用

我需要数据供以后使用,但我愿意提出一种更有效的存储方式供以后检索的建议。

soup = BeautifulSoup(content, "html.parser")
allmodels = soup.findAll('div', {'class':'model-dropdown-block'})

for model in allmodels: 
    for modelvar in model.findAll('option'): 
        print(sizevar['value'])

因此,这确实捕获了所有选项值。我需要能够忽略第一个选项(该选项始终为空),然后按所述创建字典。

我不确定我将如何编辑我的for循环以获取更多信息。我尝试过:

for model in allmodels: 
    for modelvar in model.findAll('option'): 
        print(sizevar['value'],[data-status])

但这不会产生任何结果,我知道要查找所有选项或数据状态属性,但显然我的理解是错误的!

第一篇文章在这里,所以在此先感谢!

1 个答案:

答案 0 :(得分:0)

不知道这是否可以解决问题,因为只有一小段html可以使用。但是设法获得了您想要的输出。

library(quantmod)
tickers = c("AAPL", "MSFT", "GS")
price = getQuote(tickers)
chains = lapply(tickers, getOptionChain, exp = "2019-01-25")
calls = lapply(chains, function(x) x$calls)

##I was thinking to use a function such as

which.min(abs(calls - price))

输出:

import bs4


html = '''<div class="model-dropdown-block">
                <select name="modelpid">
                    <option value="empty">Select Model</option>

                    <option value="MODEL1_530"
                            data-maxavailable="0.0"
                            data-maxorderqty="10"
                           data-status="NOT_AVAILABLE">                                
                           Jet Fighter       </option>


                        <option value="MODEL2_540"
                            data-maxavailable="0.0"
                            data-maxorderqty="10"
                            data-status="NOT_AVAILABLE">                                
                            Jet Fighter2     </option>'''




soup = bs4.BeautifulSoup(html, 'html.parser')


allmodels = soup.findAll('div', {'class':'model-dropdown-block'})[0]
models = allmodels.find_all('option')


model_dict = {}
for model in models: 

    model_key = model.text.strip()
    option_value = model.get('value')
    data_status = model.get('data-status')

    model_dict[model_key] = [option_value, data_status]