Веб-скрейпинг с помощью BS4 — Вы можете это уладить?

#python #web-scraping

Вопрос:

Можете ли вы исправить этот код для меня? Это дает мне ошибочное сообщение, такое как,

AttributeError: объект набора результатов не имеет атрибута «find_all». Вероятно, вы рассматриваете список элементов как один элемент. Вы звонили find_all (), когда собирались позвонить find()?

Кто-нибудь может, пожалуйста, помочь мне в этом? Ниже приведен код

 import pandas as pd
import requests
from bs4 import BeautifulSoup 

url="https://www.cse.lk/pages/trade-summary/trade-summary.component.html"

data  = requests.get(url).text
soup = BeautifulSoup(data, 'html5lib')

cse = pd.DataFrame(columns=["Company Name", "Symbol", "Share Volume", "Trade Volume", "Previous Close (Rs.)", "Open (Rs.)", "High (Rs.)", "Low (Rs.)", "**Last Traded Price (Rs.)", "Change (Rs.)", "Change Percentage (%)"])
for row in soup.find_all('tbody').find_all('tr'): ##for row in soup.find("tbody").find_all('tr'):
    col = row.find_all("td")
    Company_Name = col[0].text
    Symbol = col[1].text
    Share_Volume = col[2].text
    Trade_Volume = col[3].text
    Previous_Close = col[4].text
    Open = col[5].text
    High = col[6].text
    Low = col[7].text
    Last_Traded_Price = col[8].text
    Change = col[9].text
    Change_Percentage = col[10].text
    cse = cse.append({"Company Name":Company_Name,"Symbol":Symbol,"Share Volume":Share_Volume,"Trade Volume":Trade_Volume,"Previous Close (Rs.)":Previous_Close,"Open (Rs.)":Open,"High (Rs.)":High,"Low (Rs.)":Low,"**Last Traded Price (Rs.)":Last_Traded_Price,"Change (Rs.)":Change,"Change Percentage (%)":Change_Percentage}, ignore_index=True)
 

Ответ №1:

Данные загружаются с внешнего URL-адреса с помощью Javascript, поэтому beautifulsoup они не отображаются. Вы можете использовать этот пример, чтобы загрузить его:

 import requests
import pandas as pd

url = "https://www.cse.lk/api/tradeSummary"

data = requests.post(url).json()
df = pd.DataFrame(data["reqTradeSummery"])

print(df)
df.to_csv("data.csv", index=None)
 

С принтами:

        id                                                       name      symbol  quantity  percentageChange  change    price  previousClose     high      low  lastTradedTime    issueDate      turnover  sharevolume  tradevolume     marketCap  marketCapPercentage     open  closingPrice  crossingVolume  crossingTradeVol  status
0     204                                      ABANS ELECTRICALS PLC  ABAN.N0000       317          4.184704    7.25   180.50         173.25   183.00   172.00   1626944252441  01/JAN/1984  1.256363e 06         7012           44  9.224561e 08                  0.0   179.00        180.50            7012                44       0
1    1845                                          ABANS FINANCE PLC  AFSL.N0000        89         -3.225806   -1.00    30.00          31.00    30.10    30.00   1626944124197  27/JUN/2011  1.160916e 06        38652           11  1.996847e 09                  0.0    30.10         30.00           38652                11       3
2    2065                                     ACCESS ENGINEERING PLC   AEL.N0000       500         -0.432900   -0.10    23.00          23.10    23.40    22.90   1626944388726  27/MAR/2012  1.968675e 07       855534          264  2.300000e 10                  0.0    23.10         23.00          855534               264       0
3     472                                             ACL CABLES PLC   ACL.N0000      1000         -0.963855   -0.40    41.10          41.50    41.70    40.90   1626944397450  01/JAN/1976  3.037800e 07       738027          421  9.846521e 09                  0.0    41.50         41.10          738027               421       0
4     406                                           ACL PLASTICS PLC  APLA.N0000        20          0.842697    2.25   269.25         267.00   272.75   266.00   1626943847820  05/APR/1995  1.436916e 06         5333           26  1.134216e 09                  0.0   272.75        269.25            5333                26       0

...
 

и сохраняет data.csv (скриншот из LibreOffice);

введите описание изображения здесь

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

1. спасибо @Andrej . Могу ли я узнать причину использования ссылки API для расположения URL-адреса вместо указанной?

2. @SnyderFox URL https://www.cse.lk/pages/trade-summary/trade-summary.component.html -адрес не содержит данных. Вместо этого он использует JavaScript для динамического подключения https://www.cse.lk/api/tradeSummary и загрузки даты. Поэтому , когда вы анализируете первый URL bs4 -адрес, вы не видите данные.

3. Спасибо. Как вы преобразовали ссылку в ссылку api? я новичок в python. вот почему…

4. @SnyderFox Когда вы откроете вкладку Инструменты разработчика Firefox->Сеть (в Chrome есть что-то подобное) и выполните перезагрузку, вы увидите все запросы, которые выполняет страница. Одним из таких запросов является этот URL-адрес API с данными.

5. Привет, Андрей, могу я узнать одну вещь, пожалуйста? Как вы взяли «reqTradeSummery» в df = pd.DataFrame(данные[«reqTradeSummery»])? где я могу это найти?