выскабливание greatschools.org с помощью BeautifulSoup возвращает пустой список - PullRequest
0 голосов
/ 03 января 2019

Я учился чистить сайт greatschools.org с помощью BeautifulSoup. Я зашел в тупик, несмотря на поиск различных решений здесь и в других местах. Используя функцию «осмотреть» в Chrome, я вижу, что на сайте есть теги таблиц, но find_all ('tr') или find_all ('table') или find_all ('tbody') возвращает пустой список. Что мне не хватает?

вот код блока, который я использую:

import requests
from bs4 import BeautifulSoup

url = "https://www.greatschools.org/pennsylvania/bethlehem/schools/? 
tableView=Overview&view=table"
page_response = requests.get(url)
content = BeautifulSoup(page_response.text,"html.parser")

table=content.find_all('table')
table

Вывод: []

Заранее спасибо за помощь.

Ответы [ 2 ]

0 голосов
/ 03 января 2019

Таблица генерируется Javascript, но в источнике страницы есть данные JSON для этой таблицы.

Для получения данных вы можете использовать BeautifulSoup и json

page_response = requests.get(url)
content = BeautifulSoup(page_response.text, "html.parser")
scripts = content.find_all('script')
jsonObj = None
for script in scripts:
    if 'gon.search' in script.text:
        jsonStr = script.text.split('gon.search=')[1].split(';')
        jsonObj = json.loads(jsonStr[0])

for school in jsonObj['schools']:
    print(school['name'])

или использовать re и json

page_response = requests.get(url)
jsonStr = re.search(r'gon.search=(.*?);', page_response.text).group(1)
jsonObj = json.loads(jsonStr)
for school in jsonObj['schools']:
    print(school['name'])
0 голосов
/ 03 января 2019

вы можете использовать Selenium , так как выглядит, что страница динамическая.Вы все еще можете использовать Beautifulsoup для анализа, если хотите.Когда дело доходит до тегов в виде таблиц, я выбираю панды для чтения HTML.вам придется немного поработать с разбиением текста / столбцов и тем, что не в первом столбце, что не должно быть слишком сложно.)

Дайте мне знать, если это работает для вас.

import pandas as pd
from selenium import webdriver

url = "https://www.greatschools.org/pennsylvania/bethlehem/schools/?tableView=Overview&view=table"

driver = webdriver.Chrome('C:\chromedriver_win32\chromedriver.exe')
driver.get(url)

html = driver.page_source

table = pd.read_html(html)
df = table[0]

driver.close()

Вывод

print (table[0])
                                               School                       ...                                                              District
0   9/10Above averageSouthern Lehigh Intermediate ...                       ...                                       Southern Lehigh School District
1   8/10Above averageHanover El School3890 Jackson...                       ...                                        Bethlehem Area School District
2   8/10Above averageLehigh Valley Charter High Sc...                       ...                        Lehigh Valley Charter High School For The Arts
3   6/10AverageCalypso El School1021 Calypso Ave, ...                       ...                                        Bethlehem Area School District
4   6/10AverageMiller Heights El School3605 Allen ...                       ...                                        Bethlehem Area School District
5   6/10AverageAsa Packer El School1650 Kenwood Dr...                       ...                                        Bethlehem Area School District
6   6/10AverageLehigh Valley Academy Regional Cs15...                       ...                                     Lehigh Valley Academy Regional Cs
7   5/10AverageNortheast Middle School1170 Fernwoo...                       ...                                        Bethlehem Area School District
8   5/10AverageNitschmann Middle School1002 West U...                       ...                                        Bethlehem Area School District
9   5/10AverageThomas Jefferson El School404 East ...                       ...                                        Bethlehem Area School District
10  4/10Below averageJames Buchanan El School1621 ...                       ...                                        Bethlehem Area School District
11  4/10Below averageLincoln El School1260 Gresham...                       ...                                        Bethlehem Area School District
12  4/10Below averageGovernor Wolf El School1920 B...                       ...                                        Bethlehem Area School District
13  4/10Below averageSpring Garden El School901 No...                       ...                                        Bethlehem Area School District
14  4/10Below averageClearview El School2121 Abing...                       ...                                        Bethlehem Area School District
15  4/10Below averageLiberty High School1115 Linde...                       ...                                        Bethlehem Area School District
16  4/10Below averageEast Hills Middle School2005 ...                       ...                                        Bethlehem Area School District
17  4/10Below averageFreedom High School3149 Chest...                       ...                                        Bethlehem Area School District
18  3/10Below averageMarvine El School1425 Livings...                       ...                                        Bethlehem Area School District
19  3/10Below averageWilliam Penn El School1002 Ma...                       ...                                        Bethlehem Area School District
20  3/10Below averageLehigh Valley Dual Language C...                       ...                            Lehigh Valley Dual Language Charter School
21  2/10Below averageBroughal Middle School114 Wes...                       ...                                        Bethlehem Area School District
22  2/10Below averageDonegan El School1210 East 4t...                       ...                                        Bethlehem Area School District
23  2/10Below averageFountain Hill El School1330 C...                       ...                                        Bethlehem Area School District
24  Currently unratedSt. Anne School375 Hickory St...                       ...                                                                   NaN

[25 rows x 7 columns]

Теперь, если вы все еще хотите использовать BeautifulSoup, потому что, возможно, вы пытаетесь также извлечь некоторые из этих ссылок или другие теги внутритаблицу (может быть, просто получить таблицу недостаточно для того, что вы хотите сделать?), вы можете просто продолжить, как обычно, с bs4, когда получите page_response.

from bs4 import BeautifulSoup
from selenium import webdriver

url = "https://www.greatschools.org/pennsylvania/bethlehem/schools/?tableView=Overview&view=table"

driver = webdriver.Chrome('C:\chromedriver_win32\chromedriver.exe')
driver.get(url)

page_response = driver.page_source

content = BeautifulSoup(page_response,'html.parser')  
table=content.find_all('table')
table

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