복붙노트

[PYTHON] 더 강력한 HTML 파서를 파이썬 기계화에 연결할 수 있습니까?

PYTHON

더 강력한 HTML 파서를 파이썬 기계화에 연결할 수 있습니까?

구문 분석하고 mechanize를 사용하여 웹 사이트에서 양식을 제출하려고하지만 기본 제공 양식 파서가 양식과 요소를 감지 할 수없는 것으로 보입니다. 나는 잘못 구성된 HTML에 질식하는 것으로 의심하고, 나쁜 HTML (lxml 또는 BeautifulSoup)을 처리하고 폼에 미리 정제 된 출력을 제공하도록 더 잘 설계된 파서로 미리 파싱 해보고 싶습니다. 파서. 양식을 제출할 때뿐만 아니라 세션을 유지할 때도 기계화해야합니다 (로그인 세션에서이 양식을 작성하고 있습니다).

실제로 가능하다면 어떻게해야하는지 잘 모르겠다. HTTP 프로토콜의 다양한 세부 사항에 익숙하지 않다. 다양한 부품을 함께 사용하는 등 어떤 포인터가 필요한가?

해결법

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

    1.기계화 웹 사이트의 첫 번째 페이지에서 큰 예를 읽으십시오.

    기계화 웹 사이트의 첫 번째 페이지에서 큰 예를 읽으십시오.

    # Sometimes it's useful to process bad headers or bad HTML:
    response = br.response()  # this is a copy of response
    headers = response.info()  # currently, this is a mimetools.Message
    headers["Content-type"] = "text/html; charset=utf-8"
    response.set_data(response.get_data().replace("<!---", "<!--"))
    br.set_response(response)
    

    따라서 잘 구성된 HTML을 재생성하는 다른 구문 분석기로 응답을 사전 처리 한 다음 다시 처리하여 다시 처리하도록 기계화 할 수 있습니다.

  2. ==============================

    2.양식에서 양식 필드가 누락 된 문제가 있었지만 형식이 잘못된 html을 찾을 수는 없었습니다. 원인을 알아 냈으므로 BeautifulSoup의 구문 분석 기능을 사용하여 효과가있었습니다.

    양식에서 양식 필드가 누락 된 문제가 있었지만 형식이 잘못된 html을 찾을 수는 없었습니다. 원인을 알아 냈으므로 BeautifulSoup의 구문 분석 기능을 사용하여 효과가있었습니다.

    resp = br.open(url)
    soup = BeautifulSoup(resp.get_data())
    resp.set_data(soup.prettify())
    br.set_response(resp)
    

    나는 이것을 자동으로 알고 싶다.

    편집 :이 작업을 자동으로 수행하는 방법을 발견했습니다.

    class PrettifyHandler(mechanize.BaseHandler):
        def http_response(self, request, response):
            if not hasattr(response, "seek"):
                response = mechanize.response_seek_wrapper(response)
            # only use BeautifulSoup if response is html
            if response.info().dict.has_key('content-type') and ('html' in response.info().dict['content-type']):
                soup = BeautifulSoup(response.get_data())
                response.set_data(soup.prettify())
            return response
    
        # also parse https in the same way
        https_response = http_response
    
    br = mechanize.Browser()
    br.add_handler(PrettifyHandler())
    

    br는 BeautifulSoup을 사용하여 html이 콘텐츠 유형 (MIME 유형)에 포함 된 모든 응답을 구문 분석합니다 (예 : text / html).

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

    3.lxml.etree는 lxml에서 제공하는 xml.etree.ElementTree 에뮬레이터 (및 교체)로 수행 할 수 있습니다.

    lxml.etree는 lxml에서 제공하는 xml.etree.ElementTree 에뮬레이터 (및 교체)로 수행 할 수 있습니다.

    먼저 잘못된 형식의 HTML을 가져옵니다.

    % cat bad.html
    <html>
    <HEAD>
        <TITLE>this HTML is awful</title>
    </head>
    <body>
        <h1>THIS IS H1</H1>
        <A HREF=MYLINK.HTML>This is a link and it is awful</a>
        <img src=yay.gif>
    </body>
    </html>
    

    (여는 태그와 닫는 태그 사이에 대소 문자가 혼재하고 따옴표가 누락 된 경우를 관찰하십시오.)

    그리고 그것을 구문 분석 :

    >>> from lxml import etree
    >>> bad = file('bad.html').read()
    >>> html = etree.HTML(bad)
    >>> print etree.tostring(html)
    <html><head><title>this HTML is awful</title></head><body>
        <h1>THIS IS H1</h1>
        <a href="MYLINK.HTML">This is a link and it is awful</a>
        <img src="yay.gif"/></body></html>
    

    태그 추가 및 견적이 수정되었음을 확인하십시오.

    이전에 HTML을 구문 분석하는 데 문제가 있었다면 찾고있는 대답 일 수 있습니다. HTTP의 세부 사항은 완전히 다른 문제입니다.

  4. from https://stackoverflow.com/questions/1782368/is-it-possible-to-hook-up-a-more-robust-html-parser-to-python-mechanize by cc-by-sa and MIT license