【问题标题】:Finding corresponding day to lecture by webscraping通过网络抓取找到相应的讲座日期
【发布时间】:2020-09-24 13:46:03
【问题描述】:

所以我有这个网站,它由几个表格组成,它们看起来像下面的那个。

这些表格只是显示我下一次讲座的时间,表格的 URL 可以在下面的代码中找到

现在,我想抓取这个网站并获取以下信息

Date, Time, Course name, Lecturer

下面的代码几乎可以做到这一点。它会找到每堂课、名称和相关信息。 但是,我无法确定特定讲座发生在哪一天。如何将我抓取的讲座与相应的日期相匹配?

输出

['08:15-10:00', 'Forelesning i Matematikk og Fysikk', 'I.F. Pedersen']
['08:15-10:00', 'Forelesning i Matematikk og Fysikk', 'Ø. Søvik']
['10:15-12:00', 'Forelesning i Matematikk og Fysikk', 'Ø. Søvik']
['12:15-14:00', 'Forelesning i Matematikk og Fysikk', 'Ø. Søvik']

期望的输出

['22.09.2020', '08:15-10:00', 'Forelesning i Matematikk og Fysikk', 'I.F. Pedersen']
['24.09.2020', '08:15-10:00', 'Forelesning i Matematikk og Fysikk', 'Ø. Søvik']
['21.09.2020', '10:15-12:00', 'Forelesning i Matematikk og Fysikk', 'Ø. Søvik']
['23.09.2020', '12:15-14:00', 'Forelesning i Matematikk og Fysikk', 'Ø. Søvik']

这是我目前所尝试的

import requests
from bs4 import BeautifulSoup
import datetime
 
today = datetime.date.today()
year, week_num, day_of_week = today.isocalendar()  # DOW = day of week
 
URL = "http://timeplan.uit.no/emne_timeplan.php?sem=20h&module[]=TEK-0002-1#week-38"
page = requests.get(URL)
 
soup = BeautifulSoup(page.content, "html.parser")
 
results = soup.find(id="week-{}".format(week_num), class_="div_week")
 
# print(results.prettify())
 
lectures = []
 
for name in results.find_all("td", class_="object-cell"):
    title = name.find("span", class_="act-desc").get_text()
    if "forelesning" in title.lower():
        time = name.find("td", class_="object-cell-1-0").get_text()
        lecturer = name.find("a", class_="staff_url").get_text()
        lectures.append([time, title, lecturer])
 
rows = results.find("table").find("tbody").find_all("tr")
 
for lecture in lectures:
    print(lecture)

【问题讨论】:

  • 您应该共享此页面或部分的 HTML,它可以帮助找到适合的算法
  • 我认为在实际页面上使用CTRL+I 检查它会更容易吗? HTML 与大多数现代网站一样,只是一堆无休止的表格行和列元素,所以我认为仅粘贴代码不会有太多收获。
  • 您在表格中的数据是形成如下形式:<table><tr><th>...</th></tr> <tr><td>...</td></tr></table> 还是以其他方式完成?
  • 是的。我刮了<div id="week-39"> .. </div> 和whitin 这是一张表,例如<table><tr><th>...</th></tr> <tr><td>...</td></tr></table> 但是,当我尝试提取行时,我得到了27 行的混乱或一些没有给我任何工作的东西。

标签: html python-3.x datetime beautifulsoup


【解决方案1】:

在循环中使用的name 变量中,您将看到一些与页面上的详细信息弹出框相关的标签。在此弹出窗口中,您将获得您感兴趣的日期:

for name in results.find_all("td", class_="object-cell"):
    title = name.find("span", class_="act-desc").get_text()
    #Find a `a` tag that has a data-content attribute
    popover = BeautifulSoup(name.find('a', {'data-content':True}).get('data-content'))
    #Process this attribute as html and grab the date
    date = popover.find('td',text='Dato').find_next('td').text

    #... your script proceeds
    if "forelesning" in title.lower():
        time = name.find("td", class_="object-cell-1-0").get_text()
        lecturer = name.find("a", class_="staff_url").get_text()
        lectures.append([date, time, title, lecturer])

输出:

['22.09.2020 (Uke 39)', '08:15-10:00', 'Forelesning Matematikk og fysikk', 'I.F. Pedersen']
['24.09.2020 (Uke 39)', '08:15-10:00', 'Forelesning Matematikk og fysikk', 'Ø. Søvik']
['21.09.2020 (Uke 39)', '10:15-12:00', 'Forelesning Matematikk og fysikk', 'Ø. Søvik']
['23.09.2020 (Uke 39)', '12:15-14:00', 'Forelesning Matematikk og fysikk', 'Ø. Søvik']

【讨论】:

  • 我从未考虑过抓取弹出窗口!谢谢这个完美的作品,为什么你不能直接使用name.find,但必须用BeautifulSoup包装它?不管怎样,效果很好。
  • 您会看到弹出框代码嵌套在一个属性中,而不是直接嵌套在全局 html 中。这就是我提取属性然后将其处理为 html 的原因
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多