스택큐힙리스트

b><p>Webscraping using BeautifulSoup Index Error</p></b>아름답게 이쁘게 인덱스 오류를 사용하여 웹 스크래핑하기 본문

카테고리 없음

b><p>Webscraping using BeautifulSoup Index Error</p></b>아름답게 이쁘게 인덱스 오류를 사용하여 웹 스크래핑하기

스택큐힙리스트 2024. 1. 15. 14:37
반응형

BeautifulSoup을 사용하여 데이터를 가져올 때 인덱스 오류가 발생하는 곳이 있습니다. 많은 데이터를 가져올 수 있지만 어딘가에서 잘못되었습니다. 이를 어떻게 해결할 수 있을까요?

import requests
from bs4 import BeautifulSoup
totalCar = 0
for pageNumber in range(3, 7):
r = requests.get(https://www.autoscout24.com/lst/bmw?sort=standard&desc=0&offer=U&ustate=N%2CU&size=20&page=+
str(pageNumber)+&cy=D&mmm=47%7C%7C&mmm=9%7C%7C&atype=C&)
r.status_code
r.content
soup = BeautifulSoup(r.content,lxml)
#soup.prettify
car_details = soup.find_all(div,attrs={class:cl-list-element cl-list-element-gap})
for detail in car_details:
car_link = https://www.autoscout24.com+detail.a.get(href)
#print(car_link)
car_r = requests.get(car_link)
car_soup = BeautifulSoup(car_r.content,lxml)
car_make = car_soup.find(div,attrs={class:cldt-categorized-data cldt-data-section sc-pull-right}).select(dl > dd:nth-of-type(1))[0].text
#car_model = car_soup.find(div,attrs={class:cldt-categorized-data cldt-data-section sc-pull-right}).select(dl > dd:nth-of-type(2))[0].text
car_model = car_soup.find(div,attrs={class:cldt-categorized-data cldt-data-section sc-pull-right}).select(dl > dd > a)[0].text
car_year = car_soup.find(div,attrs={class:cldt-categorized-data cldt-data-section sc-pull-right}).select(dl > dd > a)[1].text
car_color = car_soup.find(div,attrs={class:cldt-categorized-data cldt-data-section sc-pull-right}).select(dl > dd > a)[2].text
car_body = car_soup.find(div,attrs={class:cldt-categorized-data cldt-data-section sc-pull-right}).select(dl > dd > a)[3].text
print(제조사:{} 모델:{} 연도:{} 색상:{} 바디:{}.format(car_make,car_model,car_year,car_color,car_body))
print(-*20)
totalCar+=1
print(totalCar)

답변 1

import requests
from bs4 import BeautifulSoup
totalCar = 0
for pageNumber in range(3, 7):
r = requests.get(https://www.autoscout24.com/lst/bmw?sort=standard&desc=0&offer=U&ustate=N%2CU&size=20&page=+
str(pageNumber)+&cy=D&mmm=47%7C%7C&mmm=9%7C%7C&atype=C&)
r.status_code
r.content
soup = BeautifulSoup(r.content,lxml)
#soup.prettify
car_details = soup.find_all(div,attrs={class:cl-list-element cl-list-element-gap})
for detail in car_details:
car_link = https://www.autoscout24.com+detail.a.get(href)
#print(car_link)
car_r = requests.get(car_link)
print(car_link)
car_soup = BeautifulSoup(car_r.content,lxml)
car_make = car_soup.find(div,attrs={class:cldt-categorized-data cldt-data-section sc-pull-right}).select(dl > dd:nth-of-type(1))[0].text
a = car_soup.find(div,attrs={class:cldt-categorized-data cldt-data-section sc-pull-right}).select(dl > dd > a)
car_model = a[0].text
car_year = a[1].text
car_color = a[2].text
car_body = car_body = a[3].text if len(a) > 3 else '-' # <-- check, if car body information is present
print(Make:{} Model:{} Year:{} Color:{} Body:{}.format(car_make,car_model,car_year,car_color,car_body))
print(-*20)
totalCar+=1
print(totalCar)

import requests
from bs4 import BeautifulSoup
totalCar = 0
for pageNumber in range(3, 7):
r = requests.get(https://www.autoscout24.com/lst/bmw?sort=standard&desc=0&offer=U&ustate=N%2CU&size=20&page=+
str(pageNumber)+&cy=D&mmm=47%7C%7C&mmm=9%7C%7C&atype=C&)
r.status_code
r.content
soup = BeautifulSoup(r.content,lxml)
#soup.prettify
car_details = soup.find_all(div,attrs={class:cl-list-element cl-list-element-gap})
for detail in car_details:
car_link = https://www.autoscout24.com+detail.a.get(href)
#print(car_link)
car_r = requests.get(car_link)
print(car_link)
car_soup = BeautifulSoup(car_r.content,lxml)
car_make = car_soup.find(div,attrs={class:cldt-categorized-data cldt-data-section sc-pull-right}).select(dl > dd:nth-of-type(1))[0].text
a = car_soup.find(div,attrs={class:cldt-categorized-data cldt-data-section sc-pull-right}).select(dl > dd > a)
car_model = a[0].text
car_year = a[1].text
car_color = a[2].text
car_body = car_body = a[3].text if len(a) > 3 else '-' # <-- check, if car body information is present
print(제조사:{} 모델:{} 연도:{} 색상:{} 바디:{}.format(car_make,car_model,car_year,car_color,car_body))
print(-*20)
totalCar+=1
print(totalCar)

인쇄:


...
--------------------
링크
메이크:
메르세데스-벤츠
모델:A 180 년도:2009 색상:회색 바디:세단
--------------------
링크
메이크:
아우디
모델:A4 년도:2008 색상:검정 바디:세단
--------------------
80

답변 2

웹 스크래핑은 BeautifulSoup을 사용하여 Index 오류가 발생할 수 있습니다.
웹 스크래핑은 인터넷 상의 정보를 추출하고 분석하는 프로세스입니다. BeautifulSoup은 웹 스크래핑을 용이하게 도와주는 파이썬 라이브러리로, HTML 및 XML 문서를 파싱하고 데이터를 추출할 수 있습니다. 하지만 이러한 작업 중에 Index 오류가 발생할 수 있습니다.
Index 오류는 일반적으로 데이터 추출 작업을 수행할 때 발생하는 문제입니다. BeautifulSoup은 웹 페이지의 HTML 구조를 탐색하여 특정 요소를 선택하는 기능을 제공합니다. 그러나 HTML 문서가 올바르게 구성되어 있지 않거나 개발자의 예상과 다른 경우, BeautifulSoup은 예기치 않은 결과를 반환하거나 Index 오류를 발생시킬 수 있습니다.
Index 오류가 발생하는 주요 이유 중 하나는 HTML 구조의 변경입니다. 웹 페이지는 주기적으로 업데이트되기 때문에 HTML 요소의 위치, 클래스명 또는 태그가 변경될 수 있습니다. 만약 웹 스크래핑 코드가 변경된 HTML 구조를 감지하지 못하면 Index 오류가 발생할 수 있습니다.
또 다른 이유는 데이터가 예상과 다른 형식으로 표시되는 경우입니다. 예를 들어, 데이터의 값을 가져올 때 특정 인덱스를 참조하지만 해당 인덱스가 비어 있거나 존재하지 않을 수 있습니다. 이 경우에도 Index 오류가 발생할 수 있습니다.
Index 오류를 방지하기 위해 다음과 같은 SEO-conscious한 접근 방식을 취할 수 있습니다.
1. 적절한 예외 처리: BeautifulSoup 작업 중에 Index 오류가 발생할 수 있다고 가정하여 적절한 예외 처리 코드를 작성해야 합니다. 예외 처리를 통해 오류가 발생한 경우 코드가 중단되지 않게 하고, 대체 데이터 처리나 오류 로깅 등의 조치를 취할 수 있습니다.
2. HTML 구조 모니터링: 웹 페이지의 HTML 구조는 때때로 변경될 수 있습니다. 따라서 스크래핑 코드를 작성한 이후에도 주기적으로 HTML 구조를 모니터링하고 검토해야 합니다. 변경 사항을 감지하고 코드를 수정하여 적합하게 대응할 수 있도록 해야 합니다.
3. 데이터 유효성 확인: 데이터 스크래핑 작업 수행 전에 가져올 데이터의 유효성을 확인하는 것이 중요합니다. 데이터가 예상과 일치하는지, 비어 있는지, 형식 등의 유효성을 검사하여 Index 오류를 방지할 수 있습니다.
4. 유연한 선택 기준: 스크래핑할 때 특정 인덱스에 의존하지 않고 유연한 선택 기준을 사용하는 것도 도움이 될 수 있습니다. HTML 요소를 선택하는 데 클래스명, 태그 유형, 속성 등 다양한 방법을 사용하여 보다 견고한 스크래핑 코드를 작성할 수 있습니다.
웹 스크래핑은 SEO-conscious한 작업이 필요한 분야입니다. 웹 페이지의 구조와 데이터 표현에 대한 변동성을 고려하고 예외 처리와 데이터 유효성 확인 등의 작업을 통해 Index 오류를 최소화해야만 정확하고 신뢰성 있는 데이터를 스크래핑할 수 있습니다. 이를 통해 SEO에 민감한 웹 사이트의 검색 엔진 최적화 작업을 지원할 수 있습니다.

반응형
Comments