Какой язык / инструмент я должен использовать для разбора HTML? - PullRequest
7 голосов
/ 24 февраля 2009

У меня есть пара сайтов, с которых я хочу извлекать данные и основываясь на предыдущем опыте, это не так просто, как кажется. Зачем? Просто потому, что HTML-страницы, которые я должен проанализировать, не отформатированы должным образом (отсутствует закрывающий тег и т. Д.).

Учитывая, что у меня нет ограничений в отношении технологии, языка или инструмента, которые я могу использовать, Каковы ваши предложения по простому анализу и извлечению данных из страниц HTML ? Я пробовал HTML Agility Pack, BeautifulSoup, и даже эти инструменты не идеальны (HTML Agility Pack содержит ошибки, и механизм синтаксического анализа BeautifulSoup не работает со страницами, которые я ему передаю).

Спасибо!

Ответы [ 6 ]

5 голосов
/ 24 февраля 2009

Вы можете использовать практически любой язык, который вам нравится , только не пытайтесь анализировать HTML с помощью регулярных выражений.

Итак, позвольте мне перефразировать это и сказать: вы можете использовать любой язык, который вам нравится, с парсером HTML, который является почти всем, что изобретено за последние 15-20 лет.

Если у вас есть проблемы с определенными страницами, я советую вам исправить их с помощью HTML Tidy .

3 голосов
/ 04 января 2013

Как язык Java и как библиотека с открытым исходным кодом Jsoup будет хорошим решением для вас.

2 голосов
/ 24 февраля 2009

Я думаю, что hpricot (связанный Колином Пикардом) - туз. Добавьте scrubyt к смеси, и вы получите отличный интерфейс для просмотра и просмотра html-файлов с возможностью сопоставления текста Ruby http://scrubyt.org/

вот пример кода из http://github.com/scrubber/scrubyt_examples/blob/7a219b58a67138da046aa7c1e221988a9e96c30e/twitter.rb

require 'rubygems'
require 'scrubyt'

# Simple exmaple for scraping basic
# information from a public Twitter
# account.

# Scrubyt.logger = Scrubyt::Logger.new

twitter_data = Scrubyt::Extractor.define do
  fetch 'http://www.twitter.com/scobleizer'

  profile_info '//ul[@class="about vcard entry-author"]' do
    full_name "//li//span[@class='fn']"
    location "//li//span[@class='adr']"
    website "//li//a[@class='url']/@href"
    bio "//li//span[@class='bio']"
  end
end

puts twitter_data.to_xml
0 голосов
/ 10 сентября 2015

Любой язык, который работает с HTML на уровне DOM, хорош.

для perl это модуль HTML :: TreeBuilder.

0 голосов
/ 24 февраля 2009

Вы можете попробовать класс PHP DOMDocument . У него есть несколько методов для загрузки содержимого HTML. Я обычно использую этот класс. Я советую добавить элемент HTML DOCTYPE к HTML, если у него его нет, и просмотреть в Firebug HTML-код, полученный после анализа. В некоторых случаях, когда встречается недопустимая разметка, DOMDocument немного переставляет элементы HTML. Кроме того, если есть метатег, определяющий кодировку внутри источника, будьте осторожны, что он будет использоваться внутри libxml при разборе разметки. Вот маленький пример

$html = file_get_contents('http://example.com');

$dom = new DOMDocument;
$oldValue = libxml_use_internal_errors(true);
$dom->loadHTML($html);
libxml_use_internal_errors($oldValue);

echo $dom->saveHTML();
0 голосов
/ 24 февраля 2009

hpricot может быть то, что вы ищете.

...