Анализатор HTML Python 3 - PullRequest
       38

Анализатор HTML Python 3

0 голосов
/ 15 января 2012

Я уверен, что все будут стонать и посоветуют мне посмотреть документацию (которая у меня есть), но я просто не понимаю, как добиться того же, что и следующее:

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 дня, и легко запутаться), простой пример был бы удивительным !!!

Ответы [ 3 ]

4 голосов
/ 15 января 2012

Это основано на ответе Ларсмана, выше.

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 интерпретирует результаты как двоичные данные, а не как строки в Юникоде, а неукрашенный 'align="center">' будет интерпретироваться как строка в Юникоде.(Это был источник TypeError выше.)

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

3 голосов
/ 15 января 2012
# no need for .readlines here
for ln in f:
    if 'align="center">' in ln:
        print(ln)

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

0 голосов
/ 15 января 2012

Я бы, вероятно, использовал бы регулярные выражения для получения самого 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 внутри нее (но вам все равно нужно экранировать экранирующие символы RE).

Надеюсьэто помогает

...