Собрать таблицу с веб-сайта JSP с помощью Python

Я хотел бы очистить таблицу, которая появляется, когда вы заходите на этот сайт: https://www.eprocure.gov.bd/resources/common/SearcheCMS.jsp

Я использовал следующий код на основе примера, показанного здесь.


options = Options()
options.add_argument('--headless')

driver = webdriver.Firefox(executable_path = "C:/Users/DefaultUser/AppData/geckodriver.exe")
driver.get("https://www.eprocure.gov.bd/resources/common/SearcheCMS.jsp")
time.sleep(5)
res = driver.execute_script("return document.documentElement.outerHTML")
driver.quit()

soup = BeautifulSoup(res, 'html.parser')
table_rows =soup.find_all('table')\[1\].find_all('tr')
rows=\[\]
for tr in table_rows:
td = tr.find_all('td')
rows.append(\[i.text for i in td\])
delaydata = rows\[3:\]
import pandas as pd
df = pd.DataFrame(delaydata, columns = \['S. No.',  'Ministry, Division, Organization PE',  'Procurement Nature, Type & Method',    'Tender/Proposal ID, Ref No., Title & Publishing Date', 'Contract Awarded To',  'Company Unique ID',    'Experience Certificate No',    'Contract Amount',  'Contract Start & End Date',    'Work Status'\])
df

Я так понимаю, что таблица создается с помощью javascript. Как выбрать таблицу в этом случае?

Nazmul 29.12.2022 06:22
Blibli Automation Journey - Как захватить сетевой трафик с помощью утилиты HAR в Selenium 4
Blibli Automation Journey - Как захватить сетевой трафик с помощью утилиты HAR в Selenium 4
Если вы являетесь веб-разработчиком или тестировщиком, вы можете быть знакомы с Selenium, популярным инструментом для автоматизации работы...
2
1
64
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Поиск URL-адреса

Ну, на самом деле, нет необходимости использовать Selenium. Данные доступны при отправке запроса POST по адресу:

https://www.eprocure.gov.bd/AdvSearcheCMSServlet
  • Как я нашел этот URL?

Что ж, если вы проверите сетевые вызовы вашего браузера (нажмите F12), вы увидите следующее:

И обратите внимание на вкладку «Полезная нагрузка»:

позже это будет использоваться как data в приведенном ниже примере.

Отлично, но как мне получить данные, включая разбиение страницы на страницы?

Чтобы получить данные, включая разбивку страницы, вы можете увидеть этот пример, где мы получаем таблицу HTML и увеличиваем pageNo для разбиения на страницы (это для таблицы/вкладки «eTenders»):

import requests
import pandas as pd
from bs4 import BeautifulSoup


data = {
    "action": "geteCMSList",
    "keyword": "",
    "officeId": "0",
    "contractAwardTo": "",
    "contractStartDtFrom": "",
    "contractStartDtTo": "",
    "contractEndDtFrom": "",
    "contractEndDtTo": "",
    "departmentId": "",
    "tenderId": "",
    "procurementMethod": "",
    "procurementNature": "",
    "contAwrdSearchOpt": "Contains",
    "exCertSearchOpt": "Contains",
    "exCertificateNo": "",
    "tendererId": "",
    "procType": "",
    "statusTab": "eTenders",
    "pageNo": "1",
    "size": "10",
    "workStatus": "All",
}


_columns = [
    "S. No",
    "Ministry, Division, Organization, PE",
    "Procurement Nature, Type & Method",
    "Tender/Proposal ID, Ref No., Title..",
    "Contract Awarded To",
    "Company Unique ID",
    "Experience Certificate No  ",
    "Contract Amount",
    "Contract Start & End Date",
    "Work Status",
]

for page in range(1, 11):  # <--- Increase number of pages here
    print(f"Page: {page}")
    data["pageNo"] = page


    response = requests.post(
        "https://www.eprocure.gov.bd/AdvSearcheCMSServlet", data=data
    )
    # The HTML is missing a `table` tag, so we need to fix it
    soup = BeautifulSoup("<table>" + "".join(response.text) + "</table>", "html.parser")
    df = pd.read_html(
        str(soup),
    )[0]

    df.columns = _columns
    print(df.to_string())

Идти дальше

Как выбрать разные вкладки/таблицы на странице?

Чтобы выбрать различные вкладки на странице, вы можете изменить «statusTab» в data. Снова проверьте вкладку полезной нагрузки, и вы поймете, что я имею в виду.

Выход

Приведенный выше код выводит:

   S. No                                                                              Ministry, Division, Organization, PE Procurement Nature, Type & Method                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        Tender/Proposal ID, Ref No., Title..             Contract Awarded To  Company Unique ID                                                    Experience Certificate No\t  Contract Amount Contract Start & End Date Work Status
0      1  Ministry of Education, Education Engineering Department, Office of the Executive Engineer, EED,Kishoreganj Zone.                   Works, NCT, LTM                                                                                                                                                                                                                                                                                                                                                                  300580, 932/EE/EED/KZ/Rev-5974/2018-19/23, Dt: 28/03/2019 Repair and Renovation Works at Chowganga Shahid Smrity High School Itna Kishoreganj. 01-Apr-2019   M/S KAZI RASEL NIRMAN SONGSTA            1051854                                       WD-5974- 25/e-GP/20221228/300580/0060000       475000.000   10-Jun-2019 03-Sep-2019   Completed
1      2            Ministry Of Water Resourses, Bangladesh Water Development Board (BWDB), Chattogram Mechanical Division                   Works, NCT, LTM                       558656, CMD/T-19/100 Dated: 14-03-2021 Manufacturing supplying & installation of 01 No MS Flap gate size - 1.65 m 1.95m and 01 no. Padestal type lifting device for sluice no S-15 6-vent 02 nos MS Vertical gate size - 1.65 m 1.95m for sluice no S-15 6-vent and sluice no S-14 new 1-vent at Coxs Bazar Sadar Upazilla of CEP Polder No 66/1 under Coxsbazar O&M Division implemented by Chattogram Mechanical Division BWDB Madunaghat Chattogram during the financial year 2020-21. 15-Mar-2021             M/S. AN Corporation            1063426                            CMD/COX/LTM-16/2020-21/e-GP/20221228/558656/0059991       503470.662   12-Apr-2021 05-May-2021   Completed
2      3            Ministry Of Water Resourses, Bangladesh Water Development Board (BWDB), Chattogram Mechanical Division                   Works, NCT, LTM                                                                633496, CMD/T-19/263 Dated: 30-11-2021 Manufacturing, supplying & installation of 07 No M.S Flap gate for sluice no.- 6 (1-vent), sluice no.- 7 (2-vent), sluice no.-8 (2-vent), sluice no.-35 (2-vent) size :- (1.00 m Ã?1.00m), 01 No Padestal type lifting device for sluice no- 13(1-vent) for CEP Polder No 64/2B, at pekua Upazilla under Chattogram Mechanical Division, BWDB, Madunaghat, Chattogram, during the financial year 2021-22. 30-Nov-2021             M/S. AN Corporation            1063426                                CMD/LTM-08/2021-22/e-GP/20221228/633496/0059989       648808.272   26-Dec-2021 31-Jan-2022   Completed
...
...

Привет, МендельГ! Спасибо за ваше грандиозное объяснение! Я понял первый после того, как отправил сообщение! Большое спасибо за вторую часть! Я верю, что это сработает, но, к сожалению, сейчас я занимаюсь другой проблемой. Я использую Jupyter, и он вызывает ошибку HTTPSConnectionPool(host='www.eprocure.gov.bd', port=443): Max retries exceeded with url: /AdvSearcheCMSServlet (Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1129)')))

Nazmul 29.12.2022 07:13

@Nazmul Это совершенно отдельный вопрос, в котором я не уверен. Попробуйте отметить этот ответ как принятый и задать новый вопрос на StackOverflow.

MendelG 29.12.2022 07:14

Я решил предыдущую проблему. Ваш код сработал! Однако я хочу превратить таблицу с разбивкой на страницы в единый фрейм данных для анализа данных. Но фрейм данных содержит только 10 строк последней страницы.

Nazmul 29.12.2022 09:03

@Nazmul Хм, я не слишком силен в pandas, но я думаю, что вы можете создать list вне loop и добавить к этому. Если у вас есть дополнительные вопросы, задайте их как новый вопрос, чтобы не загромождать раздел комментариев.

MendelG 29.12.2022 09:06

Другие вопросы по теме