Computer >> 컴퓨터 >  >> 프로그램 작성 >> Python

Python으로 HTML 테이블을 가져오기 위해 HTML 페이지를 구문 분석하는 방법은 무엇입니까?

<시간/>

문제

웹 페이지에서 HTML 테이블을 추출해야 합니다.

소개

인터넷과 월드 와이드 웹(WWW)은 오늘날 가장 눈에 띄는 정보 소스입니다. 너무 많은 정보가 있으므로 많은 옵션 중에서 콘텐츠를 선택하는 것이 매우 어렵습니다. 그 정보의 대부분은 HTTP를 통해 검색할 수 있습니다.

그러나 이러한 작업을 프로그래밍 방식으로 수행하여 정보를 자동으로 검색하고 처리할 수도 있습니다.

Python을 사용하면 표준 라이브러리 HTTP 클라이언트를 사용하여 이를 수행할 수 있지만 requests 모듈은 웹 페이지 정보를 매우 쉽게 얻는 데 도움이 됩니다.

이 게시물에서는 HTML 페이지를 구문 분석하여 페이지에 포함된 HTML 테이블을 추출하는 방법을 알아봅니다.

그것을 하는 방법..

1. 우리는 requests, pandas, beautifulsoup4 및 tabulate 패키지를 사용할 것입니다. 누락된 경우 시스템에 설치하십시오. 확실하지 않은 경우 pip freeze를 사용하여 확인하십시오.

Import Requestsimport pandas as pdfrom tabulate import tabulate

2.https://www.tutorialspoint.com/python/python_basic_operators.htm을 사용하여 페이지를 훑어보고 그 안에 포함된 모든 HTML 페이지를 인쇄합니다.

# 사이트 urlsite_url ="https://www.tutorialspoint.com/python/python_basic_operators.htm" 설정

3. 서버에 요청하고 응답을 확인합니다.

# 서버에 요청하기response =requests.get(site_url)# 응답 확인(f"*** {site_url}에 대한 응답은 {response.status_code}")

4. 응답 코드 200 - 서버의 응답이 성공했음을 나타냅니다. 이제 요청 헤더, 응답 헤더 및 서버에서 반환된 처음 100개의 텍스트를 확인합니다.

# 요청 헤더를 확인합니다.print(f"*** 요청 헤더를 인쇄합니다. - \n {response.request.headers} ")# 응답 헤더를 확인합니다.print(f"*** 요청 헤더를 인쇄합니다. - \n {response .headers} ")# 결과의 내용을 확인합니다.print(f"*** 처음 100/{len(response.text)} 문자에 액세스 - \n\n {response.text[:100]} ") 

출력

*** 요청 헤더 인쇄 -{'User-Agent':'python-requests/2.24.0', 'Accept-Encoding':'gzip, deflate', 'Accept':'*/*', '연결':'keep-alive'}*** 요청 헤더 인쇄 -{'Content-Encoding':'gzip', 'Accept-Ranges':'bytes', 'Age':'213246', 'Cache- 컨트롤':'max-age=2592000', '콘텐츠 유형':'텍스트/html; charset=UTF-8', '날짜':'2020년 10월 20일 화요일 09:45:18 GMT', '만료':'2020년 11월 19일 목요일 09:45:18 GMT', '최종 수정':' 2020년 10월 17일 토 22:31:13 GMT', '서버':'ECS(meb/A77C)', 'Strict-Transport-Security':'max-age=63072000; includeSubdomains', 'Vary':'Accept-Encoding', 'X-Cache':'HIT', 'X-Content-Type-Options':'nosniff', 'X-Frame-Options':'SAMEORIGIN', ' X-XSS-보호':'1; mode=block', 'Content-Length':'8863'}*** 처음 100/37624 문자에 액세스 -Python - 기본 연산자 - Tutorialspoint

5. 이제 BeautifulSoup을 사용하여 HTML을 구문 분석합니다.

# bs4 import BeautifulSouptutorialpoints_page =BeautifulSoup(response.text, 'html.parser')print(f"*** 페이지 제목은 - {tutorialpoints_page.title}")# HTML 페이지를 파싱합니다. 페이지 제목 as wellprint(f"*** 페이지 제목은 - {tutorialpoints_page.title.string}")

6. 대부분의 테이블에는 h2, h3, h4, h5 또는 h6 태그에 정의된 표제가 있습니다. 먼저 이러한 태그를 식별한 다음 식별된 태그 옆에 있는 html 테이블을 선택합니다. 이 논리를 위해 아래 정의된 대로 find, sister 및 find_next_siblings를 사용합니다.

# 모든 h3 요소 찾기print(f"{tutorialpoints_page.find_all('h2')}")tags =tutorialpoints_page.find(lambda elm:elm.name =="h2" or elm.name =="h3" 또는 elm.name =="h4" 또는 elm.name =="h5" 또는 elm.name =="h6") tags.find_next_siblings():if sister.name =="table":my_table =sisterdf의 형제 =pd.read_html(str(my_table))print(tabulate(df[0], headers='keys', tablefmt='psql'))

전체 코드

7.이제 모든 것을 정리합니다.

# STEP1 :페이지 필수import requestsimport pandas as pd# set the site urlsite_url ="https://www.tutorialspoint.com/python/python_basic_operators.htm# 서버에 요청하기response =requests.get(site_url )# Check the responseprint(f"*** {site_url}에 대한 응답은 {response.status_code}")# 요청 헤더를 확인합니다.print(f"*** 요청 헤더 인쇄 - \n {response.request.headers} ")# 응답 헤더를 확인합니다.print(f"*** 요청 헤더를 인쇄합니다. - \n {response.headers} ")# 결과의 내용을 확인합니다.print(f"**** 처음 100/{len(response.response.response)에 액세스합니다. text)} 문자 - \n\n {response.text[:100]} ")# bs4에서 HTML 페이지 구문 분석 import BeautifulSouptutorialpoints_page =BeautifulSoup(response.text, 'html.parser')print(f"*** 제목 of the page is - {tutorialpoints_page.title}")# 페이지 제목을 문자열로도 추출할 수 있습니다.print(f"**** 페이지 제목은 - {tutorialpoints_page.title.string}")# 모든 h3 찾기 elements# print(f"{투토 rialpoints_page.find_all('h2')}")tags =tutorialpoints_page.find(lambda 느릅나무:elm.name =="h2" 또는 elm.name =="h3" 또는 elm.name =="h4" 또는 elm.name =="h5" 또는 elm.name =="h6") tags.find_next_siblings():if sister.name =="table":my_table =sisterdf =pd.read_html(str(my_table))print(df )

출력

*** https://www.tutorialspoint.com/python/python_basic_operators.htm에 대한 응답은 200입니다.*** 요청 헤더 인쇄 -{'User-Agent':'python-requests/2.22.0' , 'Accept-Encoding':'gzip, deflate', 'Accept':'*/*', 'Connection':'keep-alive'}*** 요청 헤더 인쇄 -{'Content-Encoding':'gzip ', '수락 범위':'바이트', '나이':'558841', '캐시 제어':'max-age=2592000', '콘텐츠 유형':'텍스트/html; charset=UTF-8', '날짜':'2020년 10월 24일 토요일 09:45:13 GMT', '만료':'2020년 11월 23일 월요일 09:45:13 GMT', '최종 수정':' 2020년 10월 17일 토 22:31:13 GMT', '서버':'ECS(meb/A77C)', 'Strict-Transport-Security':'max-age=63072000; includeSubdomains', 'Vary':'Accept-Encoding', 'X-Cache':'HIT', 'X-Content-Type-Options':'nosniff', 'X-Frame-Options':'SAMEORIGIN', ' X-XSS-보호':'1; mode=block', 'Content-Length':'8863'}*** 처음 100/37624 문자에 액세스 -Python - 기본 Operators - Tutorialspoint*** 페이지 제목은 - Python - Basic Operators - Tutorialspoint*** 페이지 제목은 - Python - Basic Operators - Tutorialspoint[

입니다. 연산자 유형

,

Python 산술 연산자

,

Python 비교 연산자

,

Python 할당 연산자

,

Python 비트 연산자

,

Python 논리 연산자

,

Python 멤버십 연산자

,

Python ID 연산자

,

Python 연산자 우선 순위

][ 연산자 설명 \ 0 + 더하기 연산자의 양쪽에 값을 더합니다.1 - 빼기 왼쪽에서 오른쪽 피연산자를 뺍니다...2 * 곱하기 연산자의 양쪽에 값을 곱합니다.3 / 나누기 왼쪽 피연산자를 오른쪽 피연산자로 나눕니다.4 % 모듈러스 나누기 오른손 피연산자에 의한 왼손 피연산자...5 ** Exponent op...6에서 지수(제곱) 계산을 수행합니다. // Floor Division - 피연산자의 나눗셈은...

예시

0 a + b =301 a – b =-102 a * b =2003 b / a =24 b % a =05 a**b =10의 206 9//2 =4 및 9.0// 2.0 =4.0, -11//3 =-4, -11.... ][ 연산자 설명 \0 ==두 피연산자의 값이 같으면 ...1 !=두 피연산자의 값이 같지 않으면 같음, then ...2 <> 두 피연산자의 값이 같지 않으면 ...3> 왼쪽 피연산자의 값이 t보다 크면...4 <왼쪽 피연산자의 값이 .보다 작으면 . ..5>=왼쪽 피연산자의 값이 o...보다 큰 경우 <=왼쪽 피연산자의 값이 보다 작거나 e...

예시

0(a ==b)은 참이 아닙니다.1(a !=b)은 참입니다.2(a <> b)는 참입니다. 이것은 !=operator.3(a> b) is not true.4(a =b) is not true.6(a <=b) is true. ][ 연산자 설명 \0 =오른쪽 피연산자에서 왼쪽 피연산자에 값을 할당합니다...1 +=더하기 AND 왼쪽 피연산자에 오른쪽 피연산자를 더하고 ...2 -=빼기 AND 왼쪽 피연산자에서 오른쪽 피연산자를 뺍니다.. .3 *=곱하기 AND 오른쪽 피연산자와 왼쪽 피연산자를 곱합니다...4 /=나누기 AND 왼쪽 피연산자를 오른쪽 피연산자로 나눕니다...5 %=모듈러스 AND 두 개의 피연산자를 사용하여 모듈러스를 취하고 할당...6 **=Exponent AND 연산에 대한 지수(제곱) 계산을 수행합니다...7 //=Floor Division 연산자에 대해 바닥 나누기를 수행하고 다음과 같이...

예시

0 c =a + b는 a + b의 값을 c1에 할당 c +=a는 c =c + a2와 동일 c -=a는 c =c와 동일 - a3 c *=a는 c =와 동일 c * a4 c /=a는 c =c / a5 c %=a는 c =c % a6 c와 동일 **=a는 c =c와 동일 ** a7 c //=a는 c와 동일 =c // a ][ 연산자 \0 &이진 AND1 | Binary OR2 ^ Binary XOR3 ~ Binary Ones Complement4 <> Binary Right ShiftDescription \0 연산자가 있는 경우 결과에 비트를 복사합니다...1 피연산자 중 하나에 있으면 비트를 복사합니다.2 비트 하나의 피연산자에 설정된 경우 ...3 단항이고 '뒤집기' 효과가 있습니다. b...4 왼쪽 피연산자 값이 n만큼 왼쪽으로 이동합니다...5 왼쪽 피연산자 값이 다음만큼 오른쪽으로 이동합니다. ...

예시

0 (a &b) (평균 0000 1100)1 (a | b) =61 (평균 0011 1101)2 (a ^ b) =49 (평균 0011 0001)3 (~a ) =-61 (평균 1100 0011 in 2's 보수...4 a <<2 =240 (means 1111 0000)5 a>> 2 =15 (means 0000 1111) ][ 연산자 설명 \0 및 논리적 AND 두 피연산자가 모두 참이면 조건 ​​b ...1 또는 논리적 OR 두 피연산자 중 하나라도 0이 아니면 c...2 논리적이 아님 피연산자의 논리적 상태를 반전하는 데 사용되지 않습니다. 예0(a 및 b)은 참입니다.1(a 또는 b ) is true.2 Not(a and b) is false ][ 연산자 설명 \0 in th...에서 변수를 찾으면 true로 평가...1 not in 변수를 찾지 못하면 true로 평가... 

예시

0 x in y, x가 membe...1인 경우 x가 y에 없는 경우 결과는 1이고 x가...인 경우에는 결과가 1이 아닙니다. ][ 연산자 설명 \0 is Evaluates to s...1의 변수가 둘 중 하나가 아니면 true, 둘 중 하나의 변수가 ...
이면 false로 평가합니다.

예시

0 x는 y이고 id(x)가 i와 같으면 1이 됩니다. 1 x는 y가 아닙니다. 여기서 id(x) ... ][ Sr.No. 연산자 및 설명0 1 ** 지수(승승)1 2 ~ + - 보수, 단항 더하기 및 빼기(메서드...2 3 * / % // 곱하기, 나누기, 모듈로 및 바닥 배수...3 4 + - 덧셈과 뺄셈4 5>> <<좌우 비트 시프트5 6 &비트 'AND'6 7 ^ | 비트 배타적 `OR' 및 일반 `OR'7 8 <=<>>=비교 연산자8 9 <> ==! =등식 연산자9 10 =%=/=//=-=+=*=**=대입 연산자10 11 is not Identity 연산자11 12 in not in]