Можно ли прочитать последние несколько строк (или, скажем, 1000 символов) большой веб-страницы? - PullRequest
8 голосов
/ 07 января 2009

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

(Если бы это был локальный файл, я мог бы расположиться немного назад относительно конца файла и прочитать).

Ответы [ 7 ]

13 голосов
/ 07 января 2009

HTTP 1.1 поддерживает набор заголовков для запроса только определенного диапазона байтов, включая поддержку только последних n байтов файла (используя формат «суффикс») Смотрите здесь . Например,

Range: bytes=-1000

за последние 1000 байтов. (Конечно, если сервер поддерживает заголовок Range).

2 голосов
/ 07 января 2009

HTTP поддерживает фрагментированные ответы, что означает, что вы, вероятно, можете запросить ту же страницу, но с другим смещением IIRC. Проверьте HTTP RFC .

РЕДАКТИРОВАТЬ: после проверки RFC-2616 вам нужен заголовок Range: HTTP.

1 голос
/ 07 января 2009

У вас есть два варианта:

  1. Использовать чанкованное кодирование. См. http://msdn.microsoft.com/en-us/library/aa287673.aspx Обратите внимание на поле заголовка запроса Range. Также ваш сервер должен поддерживать его.

  2. Используйте FTP и выполните «перезапуск» команды ftp с необходимым смещением.

0 голосов
/ 07 января 2009

Если вы не можете заставить работать кодировку chunked и заголовок диапазона, тогда я предлагаю выполнить работу на стороне сервера с помощью CGI-скрипта или чего-либо еще, что вам удобно. Кажется расточительным извлекать весь файл, просто чтобы изучить всю строку!

Если вы опубликуете, какую ОС и веб-сервер вы используете, я уверен, что кто-то здесь опубликует вам рабочий скрипт CGI в течение нескольких минут, если вы застряли.

0 голосов
/ 07 января 2009

Грязным хаком было бы открыть его в Word и записать макрос для захвата последней строки (что может включать удаление таблиц и т. Д.)

Следующий код VBA открывает результат определения Google для «переполнения стека» и удаляет верхний и нижний колонтитулы, оставляя только список результатов:

Sub getWebpage()

Documents.Open FileName:="http://www.google.com/search?hl=en&safe=off&rls=com.microsoft%3A*&q=define%3A+stack+overflow"

With Selection
    .MoveDown Unit:=wdLine, Count:=8, Extend:=wdExtend
    .Delete Unit:=wdCharacter, Count:=1
    .MoveRight Unit:=wdCharacter, Count:=1
    .EndKey Unit:=wdStory
    .MoveUp Unit:=wdParagraph, Count:=5, Extend:=wdExtend
    .Delete Unit:=wdCharacter, Count:=1
End With

End Sub

Затем возьмите результат и запишите его куда-нибудь.

РЕДАКТИРОВАТЬ: Это довольно отвратительно, я только что записал и немного изменил.

0 голосов
/ 07 января 2009

Вы можете сделать это в python, используя комбинацию urllib2 (встроенный) и стороннего модуля Beautiful Soup (easy_install BeautifulSoup).

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

import urllib2
from BeautifulSoup import BeautifulSoup

page = urllib2.urlopen(url)
html = page.read()
soup = BeautifulSoup(html)
# assumes you're looking for a tag in the body with an id='last-line' attribute on it
tag = soup.html.body.find(id='last-line')
# this will print a list of the contents of the tag
print tag.contents
# if only text is inside the tag you can use this
print tag.string
0 голосов
/ 07 января 2009

Использовать FTP и возобновить программно?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...