Есть ли способ программно загрузить частичную часть веб-страницы, а не все тело HTML?

Нам нужен только определенный элемент из HTML-документа по адресу nytimes.com/technology. Эта страница содержит много статей, но нам нужен только заголовок статьи, который находится в формате . Если мы используем wget, cURL или любые другие инструменты или какой-либо пакет, например запросы в Python, весь HTML документ возвращается. Можем ли мы ограничить возвращаемые данные определенным элементом, например 's?


person Sravan    schedule 26.09.2011    source источник
comment
Хотя это не то, что вы ищете, вы можете посмотреть на следующий вопрос: веб-страница">stackoverflow.com/questions/1538952/retrieve-partial-web-page То, что вы ищете, может оказаться невозможным, потому что вам нужно иметь возможность анализировать DOM для доступа к его элементам, однако без весь документ, синтаксический анализ будет очень сложным.   -  person reader_1000    schedule 26.09.2011


Ответы (3)


Протокол HTTP ничего не знает о HTML или DOM. Используя HTTP, вы можете получать частичные документы с поддерживающих веб-серверов, используя заголовок Content-Range, но вам нужно знать смещения в байтах нужных данных.

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

person Rob Napier    schedule 26.09.2011
comment
большое спасибо! Не могли бы вы также упомянуть, как мы можем это сделать, если мы знаем смещение? - person Sravan; 26.09.2011
comment
Документация Apache включает множество примеров установки заголовков: http://labs.apache.org/webarch/http/draft-fielding-http/p5-range.html. Этот пост в блоге включает хороший пример на PHP и curl: http://www.ankur.com/blog/106/php/resume-http-downloads-php-curl-fsockopen/ - person Rob Napier; 26.09.2011

Если вы специально хотите обработать части HTML-документа, расположенного по указанному вами URL-адресу nytimes, вы, вероятно, делаете это неправильно. Если вам просто нужен список статей, например, по заголовкам, то вам нужен веб-канал. В этом случае Times публикует RSS-канал с этого самого категория статей. Обратите внимание: если вы откроете эту страницу в браузере, браузер распознает ее как фид и обработает на более высоком уровне, т. е. спросит, хотите ли вы подписаться на фид. Но вы можете нажать это с помощью curl и увидеть не проанализированный поток XML. Каждый элемент в ленте будет представлять статью и содержать метаданные, такие как URL-адрес полной статьи, заголовок и т. д.

Также обратите внимание, что, вероятно, существуют некоторые специальные пакеты веб-каналов для любой языковой платформы, которую вы используете, которые предоставят вам высокоуровневый доступ к данным канала. Это позволит вам написать такой код:

foreach ( article in feed )
    title = article.getTitle();

вместо того, чтобы анализировать xml самостоятельно.

person chad    schedule 26.09.2011
comment
да, вопрос неоднозначный. Спасибо за указание. Я имел в виду, что мы точно знаем, где находится элемент в DOM. Я отредактировал вопрос, чтобы отразить то же самое. И среда, которую я намеревался, представляет собой клиент командной строки или любой пакет на любом языке программирования. - person Sravan; 26.09.2011

Да, cURL позволяет только загружать HTML заголовки файлов, а не остальное содержимое. Используйте переключатель -I для отправки http-запроса HEAD.

Со страницы руководства:

-I, --head

(HTTP/FTP/FILE) Fetch the HTTP-header only! HTTP-servers feature the command HEAD which this uses to get nothing but the header of a document. When used on a FTP or FILE file, curl displays the file size and last modification time only.
person cdeszaq    schedule 26.09.2011
comment
Я полагаю, что OP использует заголовки здесь для ссылки на заголовки h1 внутри HTML. Если вы посмотрите на приведенный им пример (nytimes.com/technology), то именно так они представляют свои заголовки. - person Rob Napier; 26.09.2011
comment
@RobNapier - Ааа, понятно. Виноват. Я сбился с пути, когда увидел wget и cURL. Это делает вещи, связанные с DOM, теперь более понятными. - person cdeszaq; 26.09.2011