2012-01-15 2 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 как я изучаю питон на 1 день, и получить легко спутать) простой пример быть потрясающим !!!

+0

Вы можете предпочесть [этот сайт] (http://www.icanhazip.com) для получения вашего IP: вам не нужно идти через HTML, чтобы найти его. – katrielalex

+0

Ваш опубликованный код неверен, потому что вы потеряли отступ (строка 'print (lines)' должна быть отступом). – katrielalex

+0

Я знаю, он продолжал исчезать, когда я устанавливал его как код при публикации. Это правильно в файле. – beoliver

ответ

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 перебирает строки в файле типа объекта, ф. Python позволяет вам перебирать строки в файле, как и элементы в списке.

if b'align="center">' in line ищет строку 'align = "center">' в текущей строке. b указывает, что это буфер байтов, а не строка. Похоже, что urllib.reqquest.urlopen интерпретирует результаты как двоичные данные, а не строки unicode, а незакрашенный 'align="center">' будет интерпретироваться как строка юникода. (Это было источником TypeError выше.)

next(f) принимает следующую строку файла, потому что ваш оригинальный awk-скрипт напечатал строку после 'align = "center">', а не по текущей строке. Метод decode (строки имеют методы в Python) принимает двоичные данные и преобразует их в печатный юникодный объект. Метод rstrip() полоски любой замыкающие пробелы (а именно, символ новой строки в конце каждой строки

+0

Удивительно! Спасибо – beoliver

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

Но обязательно прочтите Python tutorial.

+0

ТипError: Тип str не поддерживает буфер API – beoliver

+0

Я читаю его сейчас – beoliver

+0

Файл «ip.py ", строка 7, в if 'align =" center ">' in ln: ТипError: Тип str не поддерживает буфер API – beoliver

0

я бы, вероятно, использовать регулярные выражения, чтобы получить сам ф:.

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, period, 1-3digits, ...

Я предполагаю, что вы искали линию, вы можете просто расширить строку в выражении findall(), чтобы позаботиться об этом. (см. python docs для re для более подробной информации). Кстати, r перед строкой соответствия делает ее необработанной, поэтому вы не нужно будет скрывать символы escape-кода python внутри него (но вам все равно нужно избегать символов escape-кода RE).

Надежда, что помогает

+0

Ваш код дает мне: 'TypeError: не могу использовать string pattern на байтовом объекте – beoliver

+0

Это еще один признак проблемы с unicode/bytes. Вам понадобится 'html_text = f.read(). decode()'. – HardlyKnowEm

+0

Интересно, это эффект Python 2.7 vs Python 3? Я запустил код (на Python 2.7), и он сработал. Спасибо mlefavor за указание на решение. – djupp

Смежные вопросы