Как определить, есть ли у очищенного HTML-элемента класс - PullRequest
0 голосов
/ 28 декабря 2018

Я собираю расписание с этого сайта Medmar и хотел бы определить li элементов, которые имеют класс .tratta , чтобы я могсоздайте JSON с этим форматом, где ROUTE - это текст, который я получаю из элемента li с классом .tratta и временем отправления от других

{'ROUTE': 'Casamicciola >> Pozzuoli', 'DEPARTURE TIME': '08:00'}

Эточто я пытался до сих пор:

import urllib.request
from bs4 import BeautifulSoup
import json

medmar_live_departures_url = "https://www.medmargroup.it/"
headers = {'user-agent':'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.3'}
request = urllib.request.Request(medmar_live_departures_url,headers=headers)
html = urllib.request.urlopen(request).read()
soup = BeautifulSoup(html,'html.parser')
medmar_live_departures_data = []
medmar_live_departures_table = list(soup.select('.primarystyle-timetable li'))
for li in medmar_live_departures_table:
    if  li.get("class") == "tratta" :
        medmar_live_departures_data.append(
        {
        'ROUTE': li.text
        })
    else:
        medmar_live_departures_data.append(
        {
        'DEPARTURE TIME': li.select('strong').text
        })

РЕДАКТИРОВАТЬ Мой код в настоящее время возвращает эту ошибку:

 'DEPARTURE TIME': li.select('strong').text
AttributeError: 'list' object has no attribute 'text'

1 Ответ

0 голосов
/ 28 декабря 2018

первая проблема, li.select('strong') должно быть li.select_one('strong') или просто li.strong.text для возврата первого элемента.

вторая проблема, .get("class") вернет массив, как ["tratta"]

if  li.get("class") == "tratta" : # not correct
if  li.get("class") == ["tratta"] : # correct
if  "tratta" in li.get("class") : # correct

третья проблема, ваш точный результат неверен

[
  {'ROUTE': 'NAPOLI PORTA DI MASSA » ISCHIA'}, 
  {'DEPARTURE TIME': '08:35'},
  {'DEPARTURE TIME': '14:10'},
  {'ROUTE': 'POZZUOLI » ISCHIA'},
  {'DEPARTURE TIME': '06:10'},
  {'DEPARTURE TIME': '09:40'}, ....
]

Правильная логика: DEPARTURE TIME это list

[
  {'ROUTE': 'NAPOLI PORTA DI MASSA » ISCHIA', 'DEPARTURE TIME': ['08:35', '14:10', '18:30']},
  {'ROUTE': 'POZZUOLI » ISCHIA', 'DEPARTURE TIME': ['06:10', '09:40', '13:30', '16:30', '20:30']}
]

и вот рабочий код

medmar_live_departures_table = list(soup.select('li.tratta'))

DEPARTURE_TIME = []
for li in medmar_live_departures_table:
    next_li = li.find_next_sibling("li")
    while next_li and next_li.get("data-toggle"):
        DEPARTURE_TIME.append(next_li.strong.text)
        next_li = next_li.find_next_sibling("li")
    medmar_live_departures_data.append({
          'ROUTE' : li.text,
          'DEPARTURE TIME' : DEPARTURE_TIME
    })
    DEPARTURE_TIME = []

print(medmar_live_departures_data)

Я использую селектор li.tratta для ROUTE value и find_next_sibling () для поиска атрибута data-toggle, который будет значением для DEPARTURE TIME

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