Веб Соскребание стола с BeautifulSoup - PullRequest
0 голосов
/ 11 октября 2019

Я пытаюсь получить календарь событий текущего месяца и сохранить его в файл в том же формате, например, дата, время, событие и местоположение) с веб-сайта моей школы https://www.umkc.edu/calendar/

У меня нет большого опыта работы с HTML, поэтому я не знаю, с чем имею дело, поэтому я использовал iframe, но я даже не знаю, правильно ли это.

Можете ли вы помочь? мне с получением таблицы, в которой есть события?

Это то, что у меня есть до сих пор:

import requests
from bs4 import BeautifulSoup

html = requests.get("https://www.umkc.edu/calendar/")
soup = BeautifulSoup(html.content, "html.parser")
print(soup.find_all("iframe"))

1 Ответ

1 голос
/ 12 октября 2019

Итак, данные добавляются динамически. Вы можете использовать тот же запрос, что и для содержимого iframe, и использовать регулярное выражение (или split), чтобы получить необходимый javascript для последующего анализа с hjson (из-за ключей без кавычек);Извлеките содержимое HTML и проанализируйте с помощью bs4. Альтернатива, показанная внизу, состоит в том, чтобы исследовать RSS-канал.

from bs4 import BeautifulSoup as bs
import requests, re, hjson
import pandas as pd

r = requests.get('https://www.trumba.com/s.aspx?calendar=UMKC&widget=main&srpc.cbid=trumba.spud.4&srpc.get=true')
p = re.compile(r'requestComplete\((.*)\);', re.DOTALL)
data = hjson.loads(re.sub('\r+|\n+|\t+','', p.findall(r.text)[0].strip()))
soup = bs(data['body'],'lxml')
p2 = re.compile(r"'(.*?)'", re.DOTALL)
results  = []

for tr in soup.select('.twSimpleTableTable tr')[2:]:
    date = tr.select_one('.twStartDate').text
    time = tr.select_one('td:has(.twStartDate) + td, .twStartTime').text
    event = p2.findall(tr.select_one('.txVMid')['title'])[0].strip()
    location = tr.select_one('.twLocation')
    if location is None:
        location = ''
    else:
        location = ' '.join([string for string in location.stripped_strings])
    row = [date, time, event, location]
    results.append(row)

df = pd.DataFrame(results)
print(df)

Или (это требует дальнейшего изучения и работы):

import requests, re
import pandas as pd
from bs4 import BeautifulSoup as bs

r = requests.get('https://www.trumba.com/calendars/UMKC.rss')
soup = bs(r.content, 'lxml')
df = pd.DataFrame(zip([i.text for i in soup.select('title')]
                 ,[i.text for i in soup.select('link')]
                 ,[re.sub('<br />|<br/>','',i.text) for i in soup.select('description')]))
print(df)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...