Нужна помощь в очистке таблицы с помощью Beautifulsoup и Selen Webdriver - PullRequest
1 голос
/ 30 апреля 2020

Итак, я работаю над попыткой веб-скрапа https://data.bls.gov/cgi-bin/surveymost?bls и смог выяснить, как сканировать веб-страницы с помощью кликов, чтобы попасть в таблицу.

Выбор, на котором я практикуюсь, происходит после того, как вы установите флажок, связанный с «Индекс стоимости трудоустройства (ECI) Гражданский (нескорректированный) - CIU1010000000000A» в разделе «Компенсация», а затем выберите «Получить данные».

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

Ниже приведен код, который у меня есть на данный момент.

Обратите внимание, что вы должны указать свой собственный путь к драйверу браузера, где я поместил <драйвер браузера>.

from bs4 import BeautifulSoup
from urllib.request import urlopen
import pandas as pd
import numpy as np
import requests
import lxml.html as lh

from selenium import webdriver
url = "https://data.bls.gov/cgi-bin/surveymost?bls"
ChromeSource = r"<browser driver>"

# Open up a Chrome browser and navigate to web page.
options = webdriver.ChromeOptions()
options.add_argument('--ignore-certificate-errors')
options.add_argument('--incognito')
options.add_argument('--headless') # will run without opening browser.
driver = webdriver.Chrome(ChromeSource, chrome_options=options)
driver.get(url)

driver.find_element_by_xpath("//input[@type='checkbox' and @value = 'CIU1010000000000A']").click()
driver.find_element_by_xpath("//input[@type='Submit' and @value = 'Retrieve data']").click()

i = 2

def myTEST(i):
    xpath = '//*[@id="col' + str(i) + '"]'
    TEST = driver.find_elements_by_xpath(xpath)

    num_page_items = len(TEST)
    for i in range(num_page_items):
        print(TEST[i].text)
myTEST(i)

# Clean up (close browser once completed task).
driver.close() 

В данный момент это касается только заголовков. Я хотел бы также получить содержание таблицы.

Если я сделаю i = 0, то получится «Год». я = 1, он производит «Период». Но если я выберу i = 2, я получу две переменные, которые имеют одинаковый идентификатор col2 для «оценочного значения» и «стандартной ошибки».

Я пытался придумать, как обойти это, и, похоже, не могу получить ничего, что я исследовал, для работы.

По сути, было бы лучше начать с того момента, когда я щелкнул мышью и попал на интересующую таблицу, а затем посмотреть на xpath заголовка и вытянуть текст для всех подпунктов ' с.

<tr> == $0
  <th id="col0"> Year </th>
  <th id="col1"> Period </th>
  <th id="col2">Estimated Value</th>
  <th id="col2">Standard Error</th>
<tr>

Я не уверен, как это сделать. Я также попытался l oop через {i}, но очевидно, что разделение с двумя заголовками вызывает проблему.

Как только я смогу получить заголовок, я хочу получить содержимое. Я мог бы дать вам некоторое представление о том, нахожусь ли я на правильном пути, переосмысливаю его или есть ли более простой способ сделать все это. Я учусь, и это моя первая попытка использования библиотеки селена для кликов. Я просто хочу, чтобы он работал, чтобы я мог попробовать его снова на другом столе и сделать его как можно более автоматизированным или повторно используемым (с настройкой).

1 Ответ

2 голосов
/ 30 апреля 2020

На самом деле вам не нужно selenium, вы можете просто отследить POST Form data и применить то же самое в вашем запросе POST.

Затем вы можете загрузить таблицу, используя Pandas легко.

import requests
import pandas as pd

data = {
    "series_id": "CIU1010000000000A",
    "survey": "bls"
}


def main(url):
    r = requests.post(url, data=data)
    df = pd.read_html(r.content)[1]
    print(df)


main("https://data.bls.gov/cgi-bin/surveymost")

Объяснение:

  • открыть сайт .
  • Выбрать Employment Cost Index (ECI) Civilian (Unadjusted) - CIU1010000000000A
  • Теперь вам нужно открыть браузер Инструменты разработчика и перейти к разделу Network Monitor. et c Нажмите Ctrl + Shift + E ( Команда + Параметр + E на Ма c).
  • Теперь вы найдете POST запрос выполненным.

    enter image description here

  • Перейдите на вкладку Params.

    enter image description here

  • Теперь вы можете сделайте запрос POST. и поскольку Table представлен в источнике HTML, и он не загружается через JavaScript, поэтому вы можете проанализировать его в bs4 или прочитать его в удобном формате, используя pandas .read_ html ()

Примечание. Вы можете читать таблицу, если она не загружена с помощью JavaScript. в противном случае вы можете попытаться отследить запрос XHR (проверьте предыдущий ответ ) или вы можете использовать selenium или requests_html для визуализации JS, поскольку requests - это библиотека HTTP, которая может не сделаю это для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...