Python 3 HTML解析器

0 投票
3 回答
1269 浏览
提问于 2025-04-17 10:18

我知道大家可能会觉得烦,告诉我去看看文档(我确实看过),但我就是不明白怎么做到和下面一样:

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 个回答

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的转义字符(不过你还是需要处理正则表达式的转义字符)。

希望这对你有帮助。

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

不过一定要去看看这个Python教程

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 表示这是一个字节缓冲区,而不是普通字符串。看起来 urllib.reqquest.urlopen 处理的结果是二进制数据,而不是unicode字符串,所以如果直接用 'align="center">',就会被当作unicode字符串处理。(这就是上面提到的 TypeError 的原因。)

next(f) 是用来获取文件中的下一行,因为你原来的awk脚本是打印 'align="center">' 之后的那一行,而不是当前这一行。decode 方法(在Python中,字符串有很多方法)会把二进制数据转换成可以打印的unicode对象。rstrip() 方法则是用来去掉行末的空白字符(主要是每行末尾的换行符)。

撰写回答