9

mechanize を使用して Web サイトのフォームを解析して送信しようとしていますが、組み込みのフォーム パーサーがフォームとその要素を検出できないようです。不適切な形式の HTML で窒息していると思われます。不適切な HTML (lxml や BeautifulSoup など) を処理するように設計されたパーサーで事前解析してから、きれいに整形されたクリーンアップされた出力をフォームに送りたいと思います。パーサー。フォームを送信するためだけでなく、セッションを維持するためにも機械化する必要があります (ログインセッション内からこのフォームを操作しています)。

実際に可能である場合、これを行う方法がわかりません..HTTPプロトコルのさまざまな詳細、さまざまな部分を連携させる方法などに精通していません.何かポインタはありますか?

4

3 に答える 3

10

フォームフィールドがフォームから欠落しているという問題があり、不正な形式の html を見つけることができませんでしたが、それが原因であると考えたので、BeautifulSoup の prettify 関数を使用して解析し、機能しました。

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())

brBeautifulSouphtml がコンテンツ タイプ (MIME タイプ) に含まれるすべての応答を解析するために使用されます。text/html

于 2011-02-18T09:27:11.523 に答える
3

mechanize Web サイトの最初のページにある大きな例を読むと、次のようになります。

# 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 を再生成する別のパーサーで応答を前処理し、それをフィードバックしてさらに処理するために機械化することは非常に可能です。

于 2009-11-23T15:13:27.173 に答える
1

あなたが探していることlxml.etreeは、xml.etree.ElementTreeによって提供されるエミュレーター(および代替品)で実行できますlxml

まず、不適切な不正な 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 の詳細については、まったく別の問題です。

于 2009-11-23T15:14:38.903 に答える