[PYTHON] 표준 라이브러리를 사용하여 잘못된 형식의 HTML을 파이썬에서 구문 분석하는 방법
PYTHON표준 라이브러리를 사용하여 잘못된 형식의 HTML을 파이썬에서 구문 분석하는 방법
파이썬에 내장 된 HTML 및 XML 라이브러리가 너무 많아 실제 HTML 구문 분석을 지원하지 않는다고 생각하기 어렵습니다.
이 작업을 위해 많은 써드 파티 라이브러리를 발견했지만,이 질문은 파이썬 표준 라이브러리에 관한 것입니다.
요구 사항 :
보너스 포인트 :
요청한대로 내 90 % 솔루션이 있습니다. 이것은 내가 시도한 제한된 HTML 집합에서 작동하지만 모든 사람이 분명히 볼 수 있듯이이 방식은 정확하지 않습니다. 내가 15 분 동안 한 줄의 코드를 쳐다 보면서 이렇게 했으므로 stackoverflow 커뮤니티와 비슷하지만 더 나은 해결책을 찾을 수있을 것이라고 생각했다.
from xml.etree.ElementTree import fromstring
DOM = fromstring("<html>%s</html>" % html.replace(' ', ' '))
해결법
-
==============================
1.HTML 구문 분석은 상대적으로 현대적인 개발입니다 (이상하게 보일지 모르지만). 결과적으로 표준 라이브러리에는 아무 것도 없습니다. HTMLParser는 HTML을 처리 할 수있는 방법 인 것처럼 보일 수 있지만 일반적이지 않은 많은 HTML에서 실패합니다. 이러한 실패를 해결할 수는 있지만 생각하지 않은 또 다른 경우가 있습니다 (실제로 성공하면 모든 실패를 처리 할 때 기본적으로 BeautifulSoup을 다시 작성해야합니다.)
HTML 구문 분석은 상대적으로 현대적인 개발입니다 (이상하게 보일지 모르지만). 결과적으로 표준 라이브러리에는 아무 것도 없습니다. HTMLParser는 HTML을 처리 할 수있는 방법 인 것처럼 보일 수 있지만 일반적이지 않은 많은 HTML에서 실패합니다. 이러한 실패를 해결할 수는 있지만 생각하지 않은 또 다른 경우가 있습니다 (실제로 성공하면 모든 실패를 처리 할 때 기본적으로 BeautifulSoup을 다시 작성해야합니다.)
HTML을 파싱하는 데에는 실제로 웹상에서 볼 수있는 3 가지 합리적인 방법이 있습니다 : lxml.html, BeautifulSoup 및 html5lib. lxml은 가장 빠르지 만 설치하기가 약간 까다 롭습니다 (App Engine과 같은 환경에서는 불가능합니다). html5lib는 HTML 5가 구문 분석을 지정하는 방법을 기반으로합니다. 실제로 다른 두 개와 비슷하지만, 깨진 HTML을 파싱하는 방법에서 더 정확할 수 있습니다 (모두 예쁜 HTML을 파싱합니다). 그들은 모두 깨진 HTML을 파싱 할 때 존경할만한 일을합니다. BeautifulSoup는 불필요하게 기발한 API를 발견했지만 편리 할 수 있습니다.
-
==============================
2.BeautifulSoup의 소스 코드를 가져 와서 스크립트에 복사하십시오 ;-) 나는 농담 일뿐입니다 ... 당신이 할 수있는 일은 이미 그런 라이브러리에 이미 존재하는 기능을 복제하는 것입니다.
BeautifulSoup의 소스 코드를 가져 와서 스크립트에 복사하십시오 ;-) 나는 농담 일뿐입니다 ... 당신이 할 수있는 일은 이미 그런 라이브러리에 이미 존재하는 기능을 복제하는 것입니다.
이것이 실제로 작동하지 않는다면, 표준 라이브러리 구성 요소 만 사용하는 것이 왜 중요할까요?
-
==============================
3.귀하의 요구 사항을 변경하거나 제 3 자 모듈 개발자가 수행 한 모든 작업을 복제 할 수 있습니다.
귀하의 요구 사항을 변경하거나 제 3 자 모듈 개발자가 수행 한 모든 작업을 복제 할 수 있습니다.
아름다운 수프는 약 2000 줄의 코드가있는 단일 파이썬 파일로 구성되어 있습니다. 의존성이 너무 큰 경우에는 직접 작성하여 직접 작성하십시오. 제대로 작동하지 않으며 아마도 전체적으로 작을 수도 없습니다.
-
==============================
4.does not는 단지 표준의 당신의 요구에 맞는다. 그러나 beautifulsoup는 멋지다.
does not는 단지 표준의 당신의 요구에 맞는다. 그러나 beautifulsoup는 멋지다.
-
==============================
5.stdlib에 좋은, 강력한, 휴리스틱 한 HTML 구문 분석 라이브러리를 가진 대중적인 언어는 생각할 수 없습니다. 파이썬에는 확실히 하나가 없다. 나는 당신이 알고 있다고 생각한다.
stdlib에 좋은, 강력한, 휴리스틱 한 HTML 구문 분석 라이브러리를 가진 대중적인 언어는 생각할 수 없습니다. 파이썬에는 확실히 하나가 없다. 나는 당신이 알고 있다고 생각한다.
왜 stdlib 모듈의 요구 사항입니까? 사람들이 그 요구를하는 것을 듣는 대부분의 시간은 어리 석다. 대부분의 주요 작업의 경우 타사 모듈이 필요하거나 많은 작업을 다시 구현해야합니다. 의존성을 소개하는 것은 좋은 일입니다. 그 일은 당신이 할 필요가 없기 때문입니다.
그래서 당신이 원하는 것은 lxml.html입니다. 문제가있는 경우 lxml을 코드와 함께 전달하십시오.이 시점에서 난이도, 버그 및 유지 관리 가능성을 제외하고는 직접 작성하는 것과 기능적으로 동일합니다.
-
==============================
6.이미 언급했듯이 현재 standardlib만으로는 만족스러운 해결책이 없습니다. 나 자신과 같은 문제에 봉착했다. 자신의 확장 기능과 python2.6 만 설치할 수있는 구식 호스팅 환경에서 내 프로그램 중 하나를 실행하려고했을 때. 해결책:
이미 언급했듯이 현재 standardlib만으로는 만족스러운 해결책이 없습니다. 나 자신과 같은 문제에 봉착했다. 자신의 확장 기능과 python2.6 만 설치할 수있는 구식 호스팅 환경에서 내 프로그램 중 하나를 실행하려고했을 때. 해결책:
이 파일과 3er 시리즈의 최신 stableSuper 버전 (3.2.1 현재)을 가져 오십시오. tar 파일에서 BeautifulSoup.py 만 선택하면됩니다. 실제로 코드를 제공해야합니다. 그래서 경로에이 두 파일을 가지고 있습니다. 그러면 HTML 문자열에서 임의의 etree 객체를 얻기 위해 lxml에서 얻을 수있는 것처럼 다음과 같이하면됩니다.
from StringIO import StringIO import ElementSoup tree = ElementSoup.parse(StringIO(input_str))
lxml 자체와 html5lib 모두 실행을 위해 일부 C 코드를 컴파일해야합니다. 그것들을 작동 시키려면 상당한 노력이 필요하며, 환경이 제한되어 있거나 의도 된 대상이 그것을 기꺼이하지 않으면 피하십시오.
from https://stackoverflow.com/questions/2676872/how-to-parse-malformed-html-in-python-using-standard-libraries by cc-by-sa and MIT license
'PYTHON' 카테고리의 다른 글
[PYTHON] 팬더 데이터 프레임을 시리즈로 변환 (0) | 2018.10.19 |
---|---|
[PYTHON] 대기열의 모든 항목 지우기 (0) | 2018.10.19 |
[PYTHON] pymongo.errors.CursorNotFound : 서버에서 커서 ID '...'이 유효하지 않습니다. (0) | 2018.10.19 |
[PYTHON] 제목과 xlabels가 겹치지 않도록 Matplotlib subplots_adjust hspace? (0) | 2018.10.19 |
[PYTHON] matplotlib에서 숫자 목록 얻기 (0) | 2018.10.19 |