복붙노트

[PYTHON] 표준 라이브러리를 사용하여 잘못된 형식의 HTML을 파이썬에서 구문 분석하는 방법

PYTHON

표준 라이브러리를 사용하여 잘못된 형식의 HTML을 파이썬에서 구문 분석하는 방법

파이썬에 내장 된 HTML 및 XML 라이브러리가 너무 많아 실제 HTML 구문 분석을 지원하지 않는다고 생각하기 어렵습니다.

이 작업을 위해 많은 써드 파티 라이브러리를 발견했지만,이 질문은 파이썬 표준 라이브러리에 관한 것입니다.

요구 사항 :

보너스 포인트 :

요청한대로 내 90 % 솔루션이 있습니다. 이것은 내가 시도한 제한된 HTML 집합에서 작동하지만 모든 사람이 분명히 볼 수 있듯이이 방식은 정확하지 않습니다. 내가 15 분 동안 한 줄의 코드를 쳐다 보면서 이렇게 했으므로 stackoverflow 커뮤니티와 비슷하지만 더 나은 해결책을 찾을 수있을 것이라고 생각했다.

from xml.etree.ElementTree import fromstring
DOM = fromstring("<html>%s</html>" % html.replace('&nbsp;', '&#160;'))

해결법

  1. ==============================

    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. ==============================

    2.BeautifulSoup의 소스 코드를 가져 와서 스크립트에 복사하십시오 ;-) 나는 농담 일뿐입니다 ... 당신이 할 수있는 일은 이미 그런 라이브러리에 이미 존재하는 기능을 복제하는 것입니다.

    BeautifulSoup의 소스 코드를 가져 와서 스크립트에 복사하십시오 ;-) 나는 농담 일뿐입니다 ... 당신이 할 수있는 일은 이미 그런 라이브러리에 이미 존재하는 기능을 복제하는 것입니다.

    이것이 실제로 작동하지 않는다면, 표준 라이브러리 구성 요소 만 사용하는 것이 왜 중요할까요?

  3. ==============================

    3.귀하의 요구 사항을 변경하거나 제 3 자 모듈 개발자가 수행 한 모든 작업을 복제 할 수 있습니다.

    귀하의 요구 사항을 변경하거나 제 3 자 모듈 개발자가 수행 한 모든 작업을 복제 할 수 있습니다.

    아름다운 수프는 약 2000 줄의 코드가있는 단일 파이썬 파일로 구성되어 있습니다. 의존성이 너무 큰 경우에는 직접 작성하여 직접 작성하십시오. 제대로 작동하지 않으며 아마도 전체적으로 작을 수도 없습니다.

  4. ==============================

    4.does not는 단지 표준의 당신의 요구에 맞는다. 그러나 beautifulsoup는 멋지다.

    does not는 단지 표준의 당신의 요구에 맞는다. 그러나 beautifulsoup는 멋지다.

  5. ==============================

    5.stdlib에 좋은, 강력한, 휴리스틱 한 HTML 구문 분석 라이브러리를 가진 대중적인 언어는 생각할 수 없습니다. 파이썬에는 확실히 하나가 없다. 나는 당신이 알고 있다고 생각한다.

    stdlib에 좋은, 강력한, 휴리스틱 한 HTML 구문 분석 라이브러리를 가진 대중적인 언어는 생각할 수 없습니다. 파이썬에는 확실히 하나가 없다. 나는 당신이 알고 있다고 생각한다.

    왜 stdlib 모듈의 요구 사항입니까? 사람들이 그 요구를하는 것을 듣는 대부분의 시간은 어리 석다. 대부분의 주요 작업의 경우 타사 모듈이 필요하거나 많은 작업을 다시 구현해야합니다. 의존성을 소개하는 것은 좋은 일입니다. 그 일은 당신이 할 필요가 없기 때문입니다.

    그래서 당신이 원하는 것은 lxml.html입니다. 문제가있는 경우 lxml을 코드와 함께 전달하십시오.이 시점에서 난이도, 버그 및 유지 관리 가능성을 제외하고는 직접 작성하는 것과 기능적으로 동일합니다.

  6. ==============================

    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 코드를 컴파일해야합니다. 그것들을 작동 시키려면 상당한 노력이 필요하며, 환경이 제한되어 있거나 의도 된 대상이 그것을 기꺼이하지 않으면 피하십시오.

  7. from https://stackoverflow.com/questions/2676872/how-to-parse-malformed-html-in-python-using-standard-libraries by cc-by-sa and MIT license