2012-01-15 51 views
0

我敢肯定每個人都會呻吟,並告訴我要看看文件(我有),但我只是不知道如何來達到同樣爲以下:Python 3中的HTML解析器

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

認真,有什麼建議(請不要告訴我讀http://docs.python.org/release/3.0.1/library/html.parser.html,因爲我一直在學習Python的1天,並獲得容易混淆)一個簡單的例子真棒!

+0

你可能更喜歡[本網站](http://www.icanhazip.com)讓你的IP:你不需要經過HTML找到它。 – katrielalex 2012-01-15 18:16:00

+0

您發佈的代碼是錯誤的,因爲您已經失去了縮進('print(lines)'行應該縮進)。 – katrielalex 2012-01-15 18:17:09

+0

我知道,當我在發佈時將其設置爲代碼時,它會一直消失。它在文件中是正確的。 – beoliver 2012-01-15 18:18:43

回答

4

這是基於拉斯曼的回答,上面。

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表示這是一個字節緩衝區,而不是一個字符串。看起來,urllib.reqquest.urlopen將結果作爲二進制數據而不是unicode字符串插入結果,而未修改的'align="center">'將被解釋爲unicode字符串。 (這是上面的TypeError的來源。)

next(f)需要文件的下一行,因爲原始的awk腳本在'align ='center'>''而不是當前行之後打印了該行。 decode方法(字符串在Python中有方法)獲取二進制數據並將其轉換爲可打印的unicode對象。該rstrip()方法去除任何尾隨的空白(即,在每行末尾的換行符

+0

令人驚歎!謝謝 – beoliver 2012-01-15 18:32:58

3
# no need for .readlines here 
for ln in f: 
    if 'align="center">' in ln: 
     print(ln) 

但請務必閱讀Python tutorial

+0

TypeError:Type str不支持緩衝區API – beoliver 2012-01-15 18:13:09

+0

我正在讀它 – beoliver 2012-01-15 18:13:49

+0

文件「ip。py「,第7行,在 if'align =」center「>」in ln: TypeError:Type str不支持緩衝區API – beoliver 2012-01-15 18:22:00

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-3digits,句點,1-3數字,...

我認爲你正在尋找該行,你可以簡單地在findall()表達式中擴展字符串來處理它。 python docs for re for more details) 順便說一下,匹配字符串前面的r使它成爲一個原始字符串,所以你不需要在裏面逃脫python轉義字符(但你仍然需要逃避RE轉義字符)。

希望幫助

+0

你的代碼給了我:'TypeError:can not use a字符串類型對象上的字符串模式' – beoliver 2012-01-15 19:05:48

+0

這是unicode/bytes問題的另一個症狀,你需要'html_text = f.read()。decode()'。 – HardlyKnowEm 2012-01-15 19:55:31

+0

有趣的是,這是Python 2.7與Python 3?我運行了代碼(在Python 2.7上)並且工作。感謝mlefavor指出一個解決方案。 – djupp 2012-01-18 02:55:19