2012-01-15 60 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