Как прочитать часть файла (синтаксический анализ), прервав символ "<" в python? - PullRequest
0 голосов
/ 05 марта 2011

Мне нужно разобрать html-файл в python и поместить содержимое в список.Пример: ['<html>', '<head>', '<meta name="robots" content="noindex">']

Вот то, что у меня есть сейчас для функции ошибки:

def getTexte(fp,compte=0): #returns the text before a html tag
    txt=""
    pos=fp.tell() #stock the curr position for later use
    tmppos=fp.tell() #same here
    for car in fp.read():
        if car=="<": #if we encounter the start of a html tag
            fp.seek(tmppos) #we get back to juste before the html tag
            break # and we leave this damn for
        txt=txt+car #we concatenate each car in the string
        tmppos=fp.tell() #and stock the pos for later use
    if compte==0:
        fp.seek(pos)
    if txt!="":
        return txt

Теперь вот пример вывода, который я получаю:

['<p>', 'Blablabla', 'lablabla', 'ablabla', 'blabla', 'labla', 'abla', 'bla', 'la', 'a', '</p>']

И я не могу понять почему.Может быть, слишком устал.

Ответы [ 2 ]

4 голосов
/ 05 марта 2011

Как уже говорили другие в своих комментариях, вы действительно не хотите пытаться написать HTML-парсер, перебирая ввод в виде последовательности символов. Ссылки вашего фрагмента кода на методы tell() и read() предполагают, что вы думаете об этом с точки зрения обхода открытого файла, а не даже на более высоком уровне (документ читается в буфер в виде строки).

Существует целый ряд уже написанных, свободно доступных, широко протестированных, хорошо обслуживаемых и широко признанных инструментов, специально разработанных для выполнения подобных задач. Самый популярный из них, безусловно, называется «BeautifulSoup», который славится своей надежностью и толерантностью к типу HTML, встречающемуся «в реальном мире». Целью BeautifulSoup, грубо говоря, является анализ любого HTML-кода, который разумно отобразит ваш браузер. Таким образом, он может обрабатывать множество самых распространенных ошибок в HTML - неправильно вложенные теги, контейнеры с отсутствующими закрывающими тегами, нестандартные теги и теги с нестандартными и плохо сформированными атрибутами и парами атрибут = значение и так далее.

Вот очень простой пример кода Python, использующего BeautifulSoup:

#!/bin/env python

import urllib2
from BeautifulSoup import BeautifulSoup 

def get_page(url):
    fetcher = urllib2.urlopen(url)
    results = fetcher.read()
    fetcher.close()
    return results

def find_tags(data):
    results = list()
    parser = BeautifulSoup(data)
    results.extend(parser.findAll())
    return results

if __name__ == '__main__':
    import sys, time

    for url in sys.argv[1:]:
        html=get_page(url)
        for n, each in enumerate([str(x) for x in find_tags(html)]):
            print n, each, '\n\n\n'

... как вы можете видеть, ссылки на BeautifulSoup учитывают только несколько строк здесь. Остальное - выборка HTML и печать результатов.

Эти результаты, кстати, не совсем то, что вы ищете, поскольку они представляют глубинный обход каждого HTML-контейнера от самого нижнего уровня до и его компонентов, а затем через и его компоненты и т. Д. В вашем коде вы, вероятно, захотите пройтись по этому дереву и определить, когда вы находитесь на листе, а затем каким-то образом захватить текст / содержимое или теги / код. Вы можете прочитать BeautifulSoup: Документация для деталей, которые будут более точно соответствовать вашим потребностям.

0 голосов
/ 05 марта 2011

Если все, что вам нужно сделать, это использовать вывод разобранного html, взгляните на Beautiful Soup . Мы потратили массу усилий на то, чтобы правильно проанализировать HTML (и XML), даже если вы указали неверную разметку.

Требуется ли вам создать парсер? Или вам просто нужно использовать вывод парсера? Это определит вид помощи, которую вы получите от StackOverflow. Часто, сообщая о своих намерениях (требованиях) наряду с предлагаемым решением и проблемой, люди будут указывать альтернативные решения, которые могут лучше соответствовать вашим требованиям. Пища для размышлений.

...