Анализ данных фиксированного формата, встроенных в HTML, в Python

Я использую API Google Appengine

from google.appengine.api import urlfetch

для получения веб-страницы. Результат

result = urlfetch.fetch("http://www.example.com/index.html")

это строка содержимого html (в result.content). Проблема в том, что данные, которые я хочу проанализировать, на самом деле не в форме HTML, поэтому я не думаю, что использование парсера HTML на Python сработает для меня. Мне нужно проанализировать весь простой текст в теле html-документа. Единственная проблема заключается в том, что urlfetch возвращает одну строку всего HTML-документа, удаляя все символы новой строки и лишние пробелы.

Обновлено: Хорошо, я попытался получить другой URL-адрес, и, по-видимому, urlfetch не удаляет символы новой строки, это была исходная веб-страница, которую я пытался проанализировать, которая таким образом обслуживала файл HTML ... КОНЕЦ РЕДАКТИРОВАНИЯ

Если документ выглядит примерно так:

<html><head></head><body>
AAA 123 888 2008-10-30 ABC
BBB 987 332 2009-01-02 JSE
...
A4A       288        AAA
</body></html>

result.content будет таким, после того как urlfetch его получит:

'<html><head></head><body>AAA 123 888 2008-10-30 ABCBBB 987     2009-01-02 JSE...A4A     288            AAA</body></html>'

Использование HTML-парсера не поможет мне с данными между тегами body, поэтому я собирался использовать обычные выражения для анализа моих данных, но, как вы можете видеть, последняя часть одной строки объединяется с первой частью следующей строки , и я не знаю, как его разделить. Я пытался

result.content.split('\n')

а также

result.content.split('\r')

но полученный список состоял всего из одного элемента. Я не вижу никаких параметров в функции urlfetch Google, чтобы не удалять символы новой строки.

Есть идеи, как я могу проанализировать эти данные? Может надо по другому качать?

Заранее спасибо!

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
2 246
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Единственное предложение, которое я могу придумать, - это проанализировать его, как если бы он имел столбцы фиксированной ширины. Новые строки не принимаются во внимание в HTML.

Если у вас есть контроль над исходными данными, поместите их в текстовый файл, а не в HTML.

У меня нет контроля над исходными данными ... Возможно, я могу попытаться разобрать их, так как данные имеют формат фиксированной ширины.

BrianH 03.01.2009 23:57
Ответ принят как подходящий

Я понимаю, что формат документа - это тот, который вы разместили. В этом случае я согласен с тем, что парсер, такой как Красивый суп, может быть не лучшим решением.

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

import re
data = re.findall('<body>([^\<]*)</body>', result)[0]

тогда это должно быть так просто, как:

start = 0
end = 5
while (end<len(data)):
   print data[start:end]
   start = end+1
   end = end+5
print data[start:]

(примечание: я не проверял этот код на граничные случаи, и я действительно ожидаю, что он потерпит неудачу. Это только здесь, чтобы показать общую идею)

Если у вас есть основной текст в виде одной длинной строки, вы можете разбить его следующим образом. Это предполагает, что каждая запись состоит из 26 символов.

body= "AAA 123 888 2008-10-30 ABCBBB 987     2009-01-02 JSE...A4A     288            AAA"
for i in range(0,len(body),26):
    line= body[i:i+26]
    # parse the line

Обновлено: понимание прочитанного - желательная вещь. Я пропустил бит о том, что строки запускаются вместе без разделителя между ними, в этом весь смысл, не так ли? Так что не обращайте внимания на мой ответ, на самом деле это не актуально.


Если вы знаете, что каждая строка состоит из 5 столбцов, разделенных пробелами, тогда (после удаления html) вы можете сделать что-то вроде (непроверено):

def generate_lines(datastring):
    while datastring:
        splitresult = datastring.split(' ', 5)
        if len(splitresult) >= 5:
            datastring = splitresult[5]
        else:
            datastring = None
        yield splitresult[:5]

for line in generate_lines(data):
    process_data_line(line)

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

Дополнительные предложения по разделению строки s на блоки по 26 символов:

В виде списка:

>>> [s[x:x+26] for x in range(0, len(s), 26)]
['AAA 123 888 2008-10-30 ABC',
 'BBB 987     2009-01-02 JSE',
 'A4A     288            AAA']

В качестве генератора:

>>> for line in (s[x:x+26] for x in range(0, len(s), 26)): print line
AAA 123 888 2008-10-30 ABC
BBB 987     2009-01-02 JSE
A4A     288            AAA

Замените range() на xrange() в Python 2.x, если s очень длинный.

Другие вопросы по теме