Как веб-очистка нескольких данных из одного и того же класса и атрибута в Beautiful Soup без жестко запрограммированной индексации функции find_all в Python?

#python-3.x #web-scraping #beautifulsoup

#python-3.x #веб-очистка #beautifulsoup

Вопрос:

Я веб-очистил несколько коэффициентов взаимных фондов с BeautifulSoup помощью жесткого кодирования индекса только для того, чтобы понять, что я потерял некоторые из них. Жесткое кодирование работает там, где существуют все пять соотношений, но не там, где есть только некоторые. Вебсайт, который я просматриваю.

Случай 1: который имеет все 5 коэффициентов

Случай 2: у которого нет всех 5

Код, который я пробовал:

 try:
    std_dev.append(bs1.find_all('div', attrs = {'class' : 'percentage'})[0].text.strip())
except:
    std_dev.append('N/A')
try:
    beta.append(bs1.find_all('div', attrs = {'class' : 'percentage'})[1].text.strip())
except:
    beta.append('N/A')
try:
    sharpe_ratio.append(bs1.find_all('div', attrs = {'class' : 'percentage'})[2].text.strip())
except:
    sharpe_ratio.append('N/A')
try:    
    treynors_ratio.append(bs1.find_all('div', attrs = {'class' : 'percentage'})[3].text.strip())
except:
    treynors_ratio.append('N/A')
try:
    jenisons_alpha.append(bs1.find_all('div', attrs = {'class' : 'percentage'})[4].text.strip())
except:
    jenisons_alpha.append('N/A')
 

Это привело к тому, что, например, например, значение ‘Jenison’s Alpha’ находится в столбце ‘Sharpe Ratio’ в очищенных данных.

Комментарии:

1. Не публикуйте скриншоты… Опубликуйте весь свой код и примеры в виде текста.

2. С какого URL-адреса взято второе изображение? Я не вижу этого на странице, которую вы предоставили.

3. URL для второго изображения: moneycontrol.com/mutual-funds/nav /…

Ответ №1:

Следующее должно позволить вам извлечь необходимую информацию со страницы. Затем вы можете назначить ее спискам и т. Д.

 from bs4 import BeautifulSoup as bs
url = "https://www.moneycontrol.com/mutual-funds/nav/kotak-india-growth-fund-series-iv-direct-plan-growth/MKM1087"
req = requests.get(url)
soup = bs(req.text,'lxml')

titles = [title.find(text=True, recursive=False) for title in soup.select('ul.risk_ratios h3.list')]
targets = soup.select('ul.risk_ratios div.block div.percentage')
percentages = [target.select_one('span').text for target in targets]
for t,p in zip(titles,percentages):
    print(t,p)
 

вывод:

 Standard Deviation 20.26
Beta 0.77
Sharpe Ratio 0.36
Treynor's Ratio 0.09
Jension's Alpha 2.64