Как указать таблицу для BeautifulSoup найти? - PullRequest
0 голосов
/ 07 ноября 2019

Я пытаюсь взять таблицу на этой странице https://nces.ed.gov/collegenavigator/?id=139755 под расширяемым объектом "Чистая цена". Я прошел учебные пособия по BS4, но в этом случае меня настолько смущает сложность html, что я не могу понять, какой синтаксис и какие теги использовать.

Вот скриншот таблицы и html, которые я пытаюсь получить:

enter image description here

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

import requests
from bs4 import BeautifulSoup

page = requests.get('https://nces.ed.gov/collegenavigator/?id=139755')
soup = BeautifulSoup(page.text, 'html.parser')
soup = soup.find(id="divctl00_cphCollegeNavBody_ucInstitutionMain_ctl02")
print(soup.prettify())

После того, как я смогу проанализировать эти данные, я отформатирую их в кадр данных с пандами.

Ответы [ 3 ]

1 голос
/ 07 ноября 2019

Вот базовый скрипт для очистки этой первой таблицы в этом аккордеоне:

from bs4 import BeautifulSoup
from urllib.request import urlopen

url = "https://nces.ed.gov/collegenavigator/?id=139755#netprc"

page = urlopen(url)
soup = BeautifulSoup(page, 'html.parser')

parent_table = soup.find('div', attrs={'id':'netprc'})

desired_table = parent_table.find('table')

print(desired_table.prettify())

Я предполагаю, что вам нужны только значения в таблице, поэтому я также выполнил эту версию с избыточным количеством, которая объединитимена столбцов и значения вместе:

from bs4 import BeautifulSoup
from urllib.request import urlopen

url = "https://nces.ed.gov/collegenavigator/?id=139755#netprc"

page = urlopen(url)
soup = BeautifulSoup(page, 'html.parser')

parent_table = soup.find('div', attrs={'id':'netprc'})
desired_table = parent_table.find('table')

header_row = desired_table.find_all('th')

headers = []
for header in header_row:
    header_text = header.get_text()
    headers.append(header_text)

money_values = []
data_row =desired_table.find_all('td')
for rows in data_row:
    row_text = rows.get_text()
    money_values.append(row_text)

for yrs,money in zip(headers,money_values):
    print(yrs,money)

Это выведет следующее:

 Average net price
2015-2016 $13,340
2016-2017 $15,873
2017-2018 $16,950
1 голос
/ 07 ноября 2019

В этом случае я бы, вероятно, просто использовал pandas для извлечения всех таблиц, а затем включил бы индекс для соответствующих

import pandas as pd

table = pd.read_html('https://nces.ed.gov/collegenavigator/?id=139755')[10]
print(table)

Если вы беспокоитесь о будущем порядке, вы можете зациклить таблицы, возвращаемые read_html, и проверить наличиеуникальной строки для идентификации таблицы или использования функциональности bs4: has,: содержит (bs4 4.7.1+), чтобы определить правильную таблицу, чтобы затем перейти к read_html или продолжить обработку с помощью bs4

import pandas as pd
from bs4 import BeautifulSoup as bs

r = requests.get('https://nces.ed.gov/collegenavigator/?id=139755')
soup = bs(r.content, 'lxml')
table = pd.read_html(str(soup.select_one('table:has(td:contains("Average net price"))')))
print(table)
1 голос
/ 07 ноября 2019

хорошо, может быть, это может помочь вам, я добавляю панд

import requests
from bs4 import BeautifulSoup
import pandas as pd

page = requests.get('https://nces.ed.gov/collegenavigator/?id=139755')
soup = BeautifulSoup(page.text, 'html.parser')

div = soup.find("div", {"id": "divctl00_cphCollegeNavBody_ucInstitutionMain_ctl02"})
table = div.findAll("table", {"class": "tabular"})[1]

l = []
table_rows = table.find_all('tr')
for tr in table_rows:
    td = tr.find_all('td')
    if td:
        row = [i.text for i in td]
        l.append(row)    

df=pd.DataFrame(l, columns=["AVERAGE NET PRICE BY INCOME","2015-2016","2016-2017","2017-2018"])
print(df)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...