>

다음 웹 사이트에서 데이터를 가져 오기 위해 웹 스크레이퍼를 만들려고합니다 (나중에 동일한 웹 사이트의 여러 항공사에 대해 수행하고 싶습니다) : https://www.flightradar24.com/data/airlines/kl-klm/ 경로

현재 다음 코드가 있습니다 :

from bs4 import BeautifulSoup
import requests
airlines = ['kl-klm']
for a in airlines:
    url = 'https://www.flightradar24.com/data/airlines/' + a + '/routes'
    page = requests.get(url)
    soup = BeautifulSoup(page.text, 'html.parser')
    print(soup)

이것은 전체 페이지의 소스 코드를 제공하지만 스크립트 태그 내에서 특정 텍스트 덩어리를 추출하고 싶습니다.

var arrRoutes=[{"airport1":{"country":"Denmark","iata":"AAL","icao":"EKYT","lat":57.092781,"lon":9.849164,"name":"Aalborg Airport"},"airport2":{"country":"Netherlands","iata":"AMS","icao":"EHAM","lat":52.308609,"lon":4.763889,"name":"Amsterdam Schiphol Airport"}},{"airport1":{"country":"United Kingdom","iata":"ABZ","icao":"EGPD","lat":57.201939,"lon":-2.19777,"name":"Aberdeen International Airport"},"airport2":{"country":"Netherlands","iata":"AMS","icao":"EHAM","lat":52.308609,"lon":4.763889,"name":"Amsterdam Schiphol Airport"}}...

... 등 목록 끝까지 끝까지

각 공항에 대한 총 인바운드 및 아웃 바운드 항공편 수를 찾을 수 있도록 어떻게 추출 할 수 있습니까? 예를 들어 Amsterdam Schiphol Airport가 공항 1 또는 2로 표시되는 총 횟수는 몇 번입니까?

먼저 HTML에서 문자열을 추출한 다음 사전을 사용하여 파이썬 목록으로 변환하는 방법이 있습니까? 아니면 문자열의 각 요소를 직접 계산하는 것이 더 합리적입니까?

  • 답변 # 1

    ast.literal_eval 를 사용하여 파이썬리스트에 데이터를 추출 할 수 있습니다 . 간단한 함수 find_airport() 를 만들었습니다. 데이터 및 공항 이름을 제공하고 airport_1 및 airport_2에 몇 번인지 반환합니다.

    from bs4 import BeautifulSoup
    import requests
    import re
    from ast import literal_eval
    from pprint import pprint
    airlines = ['kl-klm']
    headers = {"Host":"www.flightradar24.com",
    "Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
    "Accept-Encoding":"gzip,deflate,br",
    "User-agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.80 Safari/537.36"}
    def find_aiport(data, name):
        airport_1, airport_2 = 0, 0
        for d in data:
            if d['airport1']['name'] == name:
                airport_1 += 1
            if d['airport2']['name'] == name:
                airport_2 += 1
        return airport_1, airport_2
    for a in airlines:
        url = 'https://www.flightradar24.com/data/airlines/' + a + '/routes'
        page = requests.get(url, headers=headers)
        soup = BeautifulSoup(page.text, 'lxml')
        m = re.search(r'(?<=arrRoutes=)\[\{(.*?)\}\]', soup.text)
        l = literal_eval(m[0])
        pprint(l)
        print(find_aiport(l, 'Amsterdam Schiphol Airport'))
    
    

    인쇄 :

    [{'airport1': {'country': 'Denmark',
                   'iata': 'AAL',
                   'icao': 'EKYT',
                   'lat': 57.092781,
                   'lon': 9.849164,
                   'name': 'Aalborg Airport'},
      'airport2': {'country': 'Netherlands',
                   'iata': 'AMS',
                   'icao': 'EHAM',
                   'lat': 52.308609,
                   'lon': 4.763889,
                   'name': 'Amsterdam Schiphol Airport'}},
     {'airport1': {'country': 'United Kingdom',
                   'iata': 'ABZ',
                   'icao': 'EGPD',
                   'lat': 57.201939,
                   'lon': -2.19777,
                   'name': 'Aberdeen International Airport'},
      'airport2': {'country': 'Netherlands',
                   'iata': 'AMS',
                   'icao': 'EHAM',
                   'lat': 52.308609,
                   'lon': 4.763889,
                   'name': 'Amsterdam Schiphol Airport'}},
    ...and so on
    
    

    그리고 마지막에 :

    (147, 146)
    
    

    "암스테르담 스키폴 공항"

  • 답변 # 2

    re.compile 이용

    예 :

    import re
    soup = BeautifulSoup(page.text, 'html.parser')
    jData = soup.find("script", text=re.compile(r"var arrRoutes=.*?")).string
    print( jData.replace("var arrRoutes=", ""))
    
    

    출력 :

    [{"airport1":{"country":"Denmark","iata":"AAL","icao":"EKYT","lat":57.092781,"lon":9.849164,"name":"Aalborg Airport"},"airport2":{"country":"Netherlands","iata":"AMS","icao":"EHAM","lat":52.308609,"lon":4.763889,"name":"Amsterdam Schiphol Airport"}},{"airport1":{"country":"United Kingdom","iata":"ABZ","icao":"EGPD","lat":57.201939,"lon":-2.19777,"name":"Aberdeen International Airport"},"airport2":{"country":"Netherlands","iata":"AMS","icao":"EHAM","lat":52.308609,"lon":4.763889,"name":"Amsterdam Schiphol Airport"}},......
    
    

관련 자료

  • 이전 javascript - 문자열 보간이 비어 있거나 vuejs에 있지 않은지 확인하십시오
  • 다음 function - 배열과 사용자 입력을 사용하는 동안 파이썬 인덱스 오류