我正在从该网站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'
答案 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 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
的值,并使用find_next_sibling()搜索将成为data-toggle
的值的属性DEPARTURE TIME