如何确定刮取的HTML元素是否有一个类

时间:2018-12-27 21:25:37

标签: python web-scraping beautifulsoup

我正在从该网站Medmar抓取时间表,并希望确定具有 .tratta 类的 li 项,以便用这种格式构建一个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 :(得分:0)

第一个问题,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 TIMElist

[
  {'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的值,并使用find_next_sibling()搜索将成为data-toggle的值的属性DEPARTURE TIME