Я использую 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, чтобы не удалять символы новой строки.
Есть идеи, как я могу проанализировать эти данные? Может надо по другому качать?
Заранее спасибо!






Единственное предложение, которое я могу придумать, - это проанализировать его, как если бы он имел столбцы фиксированной ширины. Новые строки не принимаются во внимание в HTML.
Если у вас есть контроль над исходными данными, поместите их в текстовый файл, а не в HTML.
Я понимаю, что формат документа - это тот, который вы разместили. В этом случае я согласен с тем, что парсер, такой как Красивый суп, может быть не лучшим решением.
Я предполагаю, что вы уже получаете интересные данные (между тегами 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 очень длинный.
У меня нет контроля над исходными данными ... Возможно, я могу попытаться разобрать их, так как данные имеют формат фиксированной ширины.