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,容易搞混)如果能给个简单的例子就太好了!!!
3 个回答
我可能会用正则表达式来获取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的转义字符(不过你还是需要处理正则表达式的转义字符)。
希望这对你有帮助。
# no need for .readlines here
for ln in f:
if 'align="center">' in ln:
print(ln)
不过一定要去看看这个Python教程。
这段内容是基于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
表示这是一个字节缓冲区,而不是普通字符串。看起来 urllib.reqquest.urlopen
处理的结果是二进制数据,而不是unicode字符串,所以如果直接用 'align="center">'
,就会被当作unicode字符串处理。(这就是上面提到的 TypeError
的原因。)
next(f)
是用来获取文件中的下一行,因为你原来的awk脚本是打印 'align="center">' 之后的那一行,而不是当前这一行。decode
方法(在Python中,字符串有很多方法)会把二进制数据转换成可以打印的unicode对象。rstrip()
方法则是用来去掉行末的空白字符(主要是每行末尾的换行符)。