[PYTHON] 더 강력한 HTML 파서를 파이썬 기계화에 연결할 수 있습니까?
PYTHON더 강력한 HTML 파서를 파이썬 기계화에 연결할 수 있습니까?
구문 분석하고 mechanize를 사용하여 웹 사이트에서 양식을 제출하려고하지만 기본 제공 양식 파서가 양식과 요소를 감지 할 수없는 것으로 보입니다. 나는 잘못 구성된 HTML에 질식하는 것으로 의심하고, 나쁜 HTML (lxml 또는 BeautifulSoup)을 처리하고 폼에 미리 정제 된 출력을 제공하도록 더 잘 설계된 파서로 미리 파싱 해보고 싶습니다. 파서. 양식을 제출할 때뿐만 아니라 세션을 유지할 때도 기계화해야합니다 (로그인 세션에서이 양식을 작성하고 있습니다).
실제로 가능하다면 어떻게해야하는지 잘 모르겠다. HTTP 프로토콜의 다양한 세부 사항에 익숙하지 않다. 다양한 부품을 함께 사용하는 등 어떤 포인터가 필요한가?
해결법
-
==============================
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.양식에서 양식 필드가 누락 된 문제가 있었지만 형식이 잘못된 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.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의 세부 사항은 완전히 다른 문제입니다.
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
'PYTHON' 카테고리의 다른 글
[PYTHON] Excel에서 셀 너비 조정 (0) | 2018.11.18 |
---|---|
[PYTHON] 파이썬에서 매트릭스를 희소하게하는 csv (0) | 2018.11.18 |
[PYTHON] WN 효과를 사용하여 문자열의 감정 / 분위기 감지 (0) | 2018.11.18 |
[PYTHON] 판다에서 한 열을 제외한 모든 열을 선택하는 방법은 무엇입니까? (0) | 2018.11.18 |
[PYTHON] 예측 결과를 CSV로 저장 (0) | 2018.11.18 |