Разделение очищенного текста с помощью Python и Beautiful Soup - PullRequest
0 голосов
/ 29 января 2019

Я удалил расписание с этого сайта .Вывод, который я получаю:

"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
           })

Ответы [ 2 ]

0 голосов
/ 30 января 2019

Две вещи,

1. Так как «» »- это не-ascii символ, питон возвращает не-ascii символ, например,« \ u00bb », поэтому разбирает строку, разбивая текст на-ascii код, подобный так, будет работать:

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 создаст список частей из разбора, но не все тексты в HTML-теге "li" содержат символ "» "(т. Е. Текст" POZZUOLI-PROCIDA ")в конце таблицы на веб-сайте), поэтому мы должны учитывать это, или мы столкнемся с некоторыми проблемами.

2. Словарь может быть плохим выбором структуры данных, так как данные, которые вы анализируете, будутесть такие же ключи.

Например, POUZZOULI »CASAMICCIOLA и POUZOULI» PROCIDA.COSMICCIOLA и PROCIDA будут иметь одинаковый ключ.Python просто перезапишет / обновит значение ключа POUZZOULI.Таким образом, POUZZOULI: CASAMICCIOLA станет POUZZOULI: PROCIDA вместо добавления POUZZOULI: CASAMICCIOLA в качестве словарной записи и POUZZOULI: PROCIDA в качестве другой словарной статьи.

Я предлагаю добавлять каждую часть анализа в списки в виде кортежей, например1015 *

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)

Надеюсь, это поможет!

0 голосов
/ 30 января 2019

попробуйте это:

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]
           })

...