Соберите и распечатайте название события с веб-страницы - PullRequest
0 голосов
/ 18 марта 2019

Я пытаюсь заставить мою программу собирать и распечатывать заголовки событий с веб-сайта. Проблема с моим кодом в том, что он печатает больше, чем заголовок события. Он также предоставляет гиперссылку. Как избавиться от гиперссылки?

from urllib.request import urlopen
from bs4 import BeautifulSoup

url_toscrape = "https://www.ntu.edu.sg/events/Pages/default.aspx"
response = urllib.request.urlopen(url_toscrape)
info_type = response.info()
responseData = response.read()
soup = BeautifulSoup(responseData, 'lxml')

events_absAll = soup.find_all("div",{"class": "ntu_event_summary_title_first"})
for events in events_absAll:
    if len(events.text) > 0:
        print(events.text.strip())
print(events_absAll)

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

-​​7th ASEF Rectors' Conference and Students' Forum (ARC7)
-Be a Youth Corps Leader 
-NIE Visiting Artist Programme January 2019
- Exercise Classes for You: Healthy Campus@NTU
-[eLearning Course] Information & Media Literacy (From January 2019)

Заранее спасибо

Ответы [ 3 ]

0 голосов
/ 18 марта 2019

Вы можете использовать селектор атрибута = значения с оператором ^ (начинается с), чтобы указать начальную часть атрибута класса каждого заголовка

import requests
from bs4 import BeautifulSoup

url = 'https://www.ntu.edu.sg/events/Pages/default.aspx'
response = requests.get(url)  
headers = {'User-Agent','Mozilla/5.0'}
soup = BeautifulSoup(response.content,'lxml')
titles = [item.text.replace('\u200b','') for item in soup.select("[class^='ntu_event_summary_title']")]
print(titles)
0 голосов
/ 19 марта 2019

Большое спасибо за помощь.У меня сейчас есть другая проблема.Я пытаюсь собрать дату, время и место проведения мероприятия.Они вышли успешно, но тогда это не дружелюбный читатель.Как сделать так, чтобы дата, время и место отображались отдельно, например:

- event
Date:
Time:
Venue:

Я думал о разделении, но у меня было много [], что сделало его еще более уродливым.Я думал о раздевании, но мое регулярное выражение, но, похоже, ничего не делает.Есть предложения?


from urllib.request import urlopen
from bs4 import BeautifulSoup
import re

url_toscrape = "https://www.ntu.edu.sg/events/Pages/default.aspx"
response = urllib.request.urlopen(url_toscrape)
info_type = response.info()
responseData = response.read()
soup = BeautifulSoup(responseData, 'lxml')

events_absFirst = soup.find_all("div",{"class": "ntu_event_summary_title_first"})
date_absAll = tr.find_all("div",{"class": "ntu_event_summary_date"})
events_absAll = tr.find_all("div",{"class": "ntu_event_summary_title"})

for first in events_absFirst:
    print('-',first.text.strip())
    print (' ',date)

for tr in soup.find_all("div",{"class":"ntu_event_detail"}):
    date_absAll = tr.find_all("div",{"class": "ntu_event_summary_date"})
    events_absAll = tr.find_all("div",{"class": "ntu_event_summary_title"})

    for events in events_absAll:
        events = events.text.strip()
    for date in date_absAll:
        date = date.text.strip('^Time.*')
    print ('-',events)
    print (' ',date)
0 голосов
/ 18 марта 2019

Продолжая из комментариев:

from urllib.request import urlopen
from bs4 import BeautifulSoup

url_toscrape = "https://www.ntu.edu.sg/events/Pages/default.aspx"
response = urllib.request.urlopen(url_toscrape)
info_type = response.info()
responseData = response.read()
soup = BeautifulSoup(responseData, 'lxml')

events_absFirst = soup.find_all("div",{"class": "ntu_event_summary_title_first"})
events_absAll = soup.find_all("div",{"class": "ntu_event_summary_title"})
for first in events_absFirst:
    print(first.text.strip())
for events in events_absAll:
        print(events.text.strip())

ИЛИ (еще лучше) :

Используя класс ntu_event_detail и найдя внутри него a:

import requests
from bs4 import BeautifulSoup

page = requests.get("https://www.ntu.edu.sg/events/Pages/default.aspx")
soup = BeautifulSoup(page.content, 'html.parser')

events_absAll = soup.find_all("div",{"class": "ntu_event_detail"})
for events in events_absAll:
    for a in events.find_all('a'):
        print(a.text.strip())

OUTPUT :

7th ASEF Rectors' Conference and Students' Forum (ARC7)
​Be a Youth Corps Leader
​NIE Visiting Artist Programme January 2019
​Exercise Classes for You: Healthy Campus@NTU
​[eLearning Course] Information & Media Literacy (From January 2019)
​[Workshop] Introduction to Zotero (Jan to Apr 2019)
​[Workshop] Introduction to Mendeley (Jan to Apr 2019)
​Sembcorp
Marine Green Wave Environmental Care Competition 2019 - Submit by 31 March 2019
​[Consultation] Consultation for EndNote-Mac Users (Jan to Apr 2019)
​The World Asian Business Case Competition, WACC 2019 at Seoul (proposal submission by 01 April 2019)
​Heartware Network
.
.
.

EDIT : Лучше было бы создать list, сохранить в нем результаты, отфильтровать пустые строки (если есть):

data =[]
for events in events_absAll:
    for a in events.find_all('a'):
        data.append(a.text)

filtered = list(filter(None, data))  # fastest
for elem in filtered: print(elem)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...