0

誰もがうめき声を上げて、(私が持っている)ドキュメントを見るように私に言うと確信していますが、私は次のように同じことを達成する方法を理解していません:

curl -s http://www.maxmind.com/app/locate_my_ip | awk '/align="center">/{getline;print}'

これまでのところ、python3にあるのは次のとおりです。

import urllib.request

f = urllib.request.urlopen('http://www.maxmind.com/app/locate_my_ip')

for lines in f.readlines():
    print(lines)

f.close()

真剣に、どんな提案でも(私は1日間Pythonを学んでいるので、http://docs.python.org/release/3.0.1/library/html.parser.htmlを読むように言わないでください、そして簡単に混乱します)簡単な例は素晴らしいでしょう!!!

4

3 に答える 3

4

これは、上記のlarsmansの回答に基づいています。

f = urllib.request.urlopen('http://www.maxmind.com/app/locate_my_ip')
for line in f:
    if b'align="center">' in line:
        print(next(f).decode().rstrip())
f.close()

説明:

for line in fファイルのようなオブジェクトの行を繰り返します。f。Pythonでは、リスト内のアイテムと同じように、ファイル内の行を反復処理できます。

if b'align="center">' in line現在の行で文字列'align="center">'を探します。はb、これが文字列ではなくバイトのバッファであることを示します。結果をUnicode文字列ではurllib.reqquest.urlopenなくバイナリデータとしてインターペットし、装飾されていない'align="center">'ものはUnicode文字列として解釈されるようです。(それが上記の原因でしたTypeError。)

next(f)元のawkスクリプトは、現在の行ではなく'align = "center">'の後に行を出力したため、ファイルの次の行を取得します。decodeメソッド(文字列にはPythonのメソッドがあります)は、バイナリデータを取得し、それを印刷可能なUnicodeオブジェクトに変換します。このrstrip()メソッドは、末尾の空白(つまり、各行の終わりにある改行)を削除します。

于 2012-01-15T18:28:51.490 に答える
3
# no need for .readlines here
for ln in f:
    if 'align="center">' in ln:
        print(ln)

ただし、Pythonチュートリアルを必ずお読みください。

于 2012-01-15T18:10:03.770 に答える
0

私はおそらく正規表現を使用してIP自体を取得します:

import re
import urllib

f = urllib.request.urlopen('http://www.maxmind.com/app/locate_my_ip')
html_text=f.read()
re.findall(r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}',html_text)[0]

これは、フォーマットの最初の文字列を出力します:1〜3桁、ピリオド、1〜3桁、...

私はあなたがその行を探していたと思います、あなたはそれを処理するためにfindall()式の文字列を単に拡張することができます。(詳細については、Pythonのドキュメントを参照してください)。ちなみに、一致文字列の前のrは生の文字列になるため、その中のpythonエスケープ文字をエスケープする必要はありません(ただし、REエスケープ文字をエスケープする必要があります)。

お役に立てば幸い

于 2012-01-15T18:39:48.873 に答える