HTML-файл разбора Python без потери зависимостей - PullRequest
0 голосов
/ 10 октября 2019

Я пытаюсь разобрать эту html-страницу, чтобы узнать количество авиакомпаний по регионам, странам и городам: https://en.m.wikipedia.org/wiki/List_of_hub_airports

Я использую Beautifulsoup для получения данных, но проблема в том, что я получил данные отдельно,Например, все авиакомпании без региона, страны и города. Я использую метод findall для получения специальных заголовков.

Вот мой код:

from bs4 import BeautifulSoup
import requests
import pandas as pd

url = requests.get("https://en.wikipedia.org/wiki/List_of_hub_airports").text

soup = BeautifulSoup(url, "lxml")

GLOBAL =[]
l=[]
A=[]
B=[]
C=[]
D=[]
k=[]
G=[[]]
T=soup.findAll({'h2','h3','ul'})

T=soup.findAll({'h2','h3','ul'})
for line in T:
    if line.name == 'h2':
        REG = line.findAll('span', {'class': 'mw-headline'})
        if REG:
            A=REG[0].get('id')
    if line.name == 'h3':
        REG = line.findAll('span', {'class': 'mw-headline'})
        if REG:
            B=REG[0].get('id')
    if line.name == 'ul':
        if B:
            city=line.findAll('a')
            for i in city:
                if i.get('title'):
                    if i.get('title').endswith('Airport') == True:
                        D=[]
                        for i in city:
                            D.append(i.text)
                        l.append([A,B,D])
                        break


for k in l:
    print(k)

Результат:

[region,country,[cities,listArilines]]

Но ожидаемый результат:

[region,country,[city,listAirlines]]

Итак, у меня две проблемы: - Я потерял зависимость между городом и его авиакомпаниями. - Для какого-то региона / страны у меня есть таблица, например, Европа, и я не знаю, как ее проанализировать, чтобы извлечь ее из ожидаемого результата.

Мне нужна ваша помощь. Спасибо

1 Ответ

1 голос
/ 11 октября 2019

Я изменил некоторые строки в вашем коде, но я думаю, что теперь у вас будут правильные значения:

from bs4 import BeautifulSoup
import requests
import pandas as pd

url = requests.get("https://en.wikipedia.org/wiki/List_of_hub_airports").text

soup = BeautifulSoup(url, "lxml")

GLOBAL =[]
l=[]
A=[]
B=[]
C=[]
D=[]
k=[]
G=[[]]
T=soup.findAll({'h2','h3','ul'})

T=soup.findAll({'h2','h3','ul'})
for line in T:
    if line.name == 'h2':
        REG = line.findAll('span', {'class': 'mw-headline'})
        if REG:
            A=REG[0].get('id')
    if line.name == 'h3':
        REG = line.findAll('span', {'class': 'mw-headline'})
        if REG:
            B=REG[0].get('id')
    if line.name == 'ul':
        if B:
            cities = line.findChildren('li')
            for i in cities:
                if i.find('a'):
                    cityname = i.find('a').get('title')
                    airlines = i.findAll('li')
                    if airlines:
                        for a in airlines:
                            if a.find('a'):
                                D=[]
                                D.append(cityname)
                                D.append(a.text)
                                l.append([A,B,D])


for k in l:
    print(k)

РЕДАКТИРОВАТЬ

Я хочу, чтобы только одна строка вгород со списком авиакомпаний, вам просто нужно сделать это:

from bs4 import BeautifulSoup
import requests
import pandas as pd

url = requests.get("https://en.wikipedia.org/wiki/List_of_hub_airports").text

soup = BeautifulSoup(url, "lxml")

GLOBAL =[]
l=[]
A=[]
B=[]
C=[]
D=[]
k=[]
G=[[]]
T=soup.findAll({'h2','h3','ul'})

T=soup.findAll({'h2','h3','ul'})
for line in T:
    if line.name == 'h2':
        REG = line.findAll('span', {'class': 'mw-headline'})
        if REG:
            A=REG[0].get('id')
    if line.name == 'h3':
        REG = line.findAll('span', {'class': 'mw-headline'})
        if REG:
            B=REG[0].get('id')
    if line.name == 'ul':
        if B:
            cities = line.findChildren('li')
            for i in cities:
                if i.find('a'):
                    cityname = i.find('a').get('title')
                    airlines = i.findAll('li')
                    if airlines:
                        D = []
                        D.append(cityname)
                        for a in airlines:
                            if a.find('a'):
                                D.append(a.text)
                        l.append([A,B,D])


for k in l:
    print(k)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...