我已经取消了this website的时间表。 我得到的输出是:
"ROUTE": "NAPOLI PORTA DI MASSA \u00bb ISCHIA"
但是我想要:
"DEPARTURE PORT": "NAPOLI PORTA DI MASSA"
"ARRIVAL PORT": "ISCHIA"
如何分割字符串? 这是代码:
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"):
if next_li.get("class") == ["corsa-yes"]:
# departure_time.append(next_li.strong.text)
medmar_live_departures_data.append({
'ROUTE' : li.text
})
答案 0 :(得分:1)
两件事,
1。由于“»”是非ASCII字符,因此python返回非ASCII字符,如“ \ u00bb”,因此通过使用非ASCII代码拆分文本来解析字符串将是可行的: / p>
parse=li.get_text().split('\u00bb')
此外,您可以像这样使用re库来解析非ASCII字符(如果选择此路径,则需要添加re库):
import re
non_ascii = li.get_text()
parse = re.split('[^\x00-\x7f]', non_ascii)
#[^\x00-\x7f] will select non-ascii characters as pointed out by Moinuddin Quadri in https://stackoverflow.com/questions/40872126/python-replace-non-ascii-character-in-string
但是,这样做会使python从解析中创建一个零件列表,但并非“ li” html标记中的所有文本都带有“»”字符(即,文本“ POZZUOLI-PROCIDA”位于网站上的表格),因此我们必须对此负责,否则我们会遇到一些问题。
2。由于要解析的数据将具有相同的密钥,因此字典可能不是很好的数据结构选择。
例如,POUZZOULI»CASAMICCIOLA和POUZOULI»PROCIDA。 COSMICCIOLA和PROCIDA将具有相同的密钥。 Python将简单地覆盖/更新POUZZOULI键的值。因此,POUZZOULI:CASAMICCIOLA将变为POUZZOULI:PROCIDA,而不是添加POUZZOULI:CASAMICCIOLA作为词典条目,并添加POUZZOULI:PROCIDA作为另一个词典条目。
我建议将解析的每个部分作为元组添加到列表中,如下所示:
single_port= []
ports=[]
medmar_live_departures_table = list(bs.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"):
if next_li.get("class") == ["corsa-yes"]:
# departure_time.append(next_li.strong.text)
non_ascii = li.get_text()
parse = re.split('[^\x00-\x7f]', non_ascii)
# The if statement takes care of table data strings that don't have the non-ascii character "»"
if len(parse) > 1:
ports.append((parse[0], parse[1]))
else:
single_port.append(parse[0])
# This will print out your data in your desired manner
for i in ports:
print("DEPARTURE: "+i[0])
print("ARRIVAL: "+i[1])
for i in single_port:
print(i)
我还在运行的测试代码中使用了split方法:
import requests
from bs4 import BeautifulSoup
import re
url="https://www.medmargroup.it/"
response=requests.get(url)
bs=BeautifulSoup(response.text, 'html.parser')
timeTable=bs.find('section', class_="primarystyle-timetable")
medmar_live_departures_table=timeTable.find('ul')
single_port= []
ports=[]
for li in medmar_live_departures_table.find_all('li', class_="tratta"):
parse=li.get_text().split('\u00bb')
if len(parse)>1:
ports.append((parse[0],parse[1]))
else:
single_port.append(parse[0])
for i in ports:
print("DEPARTURE: "+i[0])
print("ARRIVAL: "+i[1])
for i in single_port:
print(i)
我希望这会有所帮助!
答案 1 :(得分:0)
尝试一下:
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"):
if next_li.get("class") == ["corsa-yes"]:
# departure_time.append(next_li.strong.text)
medmar_live_departures_data.append({
'DEPARTURE PORT' : li.text.split("\ u00bb")[0],
'ARRIVAL PORT' : li.text.split("\ u00bb")[1]
})