Как я могу очистить сайт с недопустимым HTML

Я пытаюсь очистить данные с веб-сайта с недопустимым HTML. Простой HTML DOM Parser анализирует его, но теряет информацию из-за того, как он обрабатывает недействительный HTML. Встроенный парсер DOM с DOMXPath не работает, он возвращает пустой набор результатов. Я смог получить его (DOMDocument и DOMXPath), работая локально после запуска извлеченного HTML-кода через PHP Tidy, но PHP Tidy не установлен на сервере и на его общем сервере хостинга, поэтому я не могу контролировать это. Я пробовал HTMLPurifier, но это похоже на то, чтобы обеспечить пользовательский ввод, поскольку он полностью удаляет теги doctype, head и body.

Есть ли какая-то отдельная альтернатива PHP Tidy? Я бы предпочел использовать DOMXPath для навигации и захвата того, что мне нужно, мне просто нужна помощь в очистке HTML, прежде чем он сможет его разобрать.

Изменить: Im соскабливает этот сайт: http://courseschedules.njit.edu/index.aspx?semester=2010f . Пока я просто пытаюсь получить все ссылки на курс.

DOM обрабатывает поврежденный HTML- loadHTML если вы используете loadHTML или loadHTMLFile :

 $dom = new DOMDocument; libxml_use_internal_errors(TRUE); $dom->loadHTMLFile('http://courseschedules.njit.edu/index.aspx?semester=2010f'); libxml_clear_errors(); $xPath = new DOMXPath($dom); $links = $xPath->query('//div[@class="courseList_section"]//a'); foreach($links as $link) { printf("%s (%s)\n", $link->nodeValue, $link->getAttribute('href')); } 

выйдет

 ACCT - Accounting (index.aspx?semester=2010f&subjectID=ACCT) AD - Art and Design (index.aspx?semester=2010f&subjectID=AD ) ARCH - Architecture (index.aspx?semester=2010f&subjectID=ARCH) ... many more ... TRAN - Transportation Engr (index.aspx?semester=2010f&subjectID=TRAN) TUTR - Tutoring (index.aspx?semester=2010f&subjectID=TUTR) URB - Urban Systems (index.aspx?semester=2010f&subjectID=URB ) 

С помощью

 echo $dom->saveXML($link), PHP_EOL; 

в цикле foreach выведет полный outerHTML ссылок.

если вы знаете ошибки, вы можете применить некоторые регулярные выражения, чтобы их исправить. Хотя это ad-hoc решение может показаться грязным, на самом деле может быть лучше, как если бы HTML действительно искажался, может оказаться сложным вывести правильную интерпретацию автоматически.

EDIT: На самом деле было бы лучше просто извлечь необходимую информацию с помощью регулярных выражений, поскольку на странице есть много ошибок, которые были бы трудными или, по крайней мере, утомительными для исправления.

Есть ли веб-служба, которая будет запускать ваш контент через Tidy? Не могли бы вы написать? Тиди – единственный здравый способ, который я знаю об исправлении сломанной разметки.

Подумайте об использовании реального браузера или элемента управления веб-браузером. Я тестировал с iMacros, и веб- скребок хорошо работает. Проверить макрос для первых двух ссылок:

 VERSION BUILD=7050962 URL GOTO=http://courseschedules.njit.edu/index.aspx?semester=2010f 'Get text 'TAG POS=2 TYPE=A FORM=ID:form1 ATTR=TXT:*-* EXTRACT=TXT 'Get link first entry TAG POS=2 TYPE=A FORM=ID:form1 ATTR=TXT:*-* EXTRACT=HREF 'Get link second entry TAG POS=3 TYPE=A FORM=ID:form1 ATTR=TXT:*-* EXTRACT=HREF 

Вы можете перемещаться между элементами, увеличивая значение POS =.

Другим простым способом решения проблемы может быть передача сайта, который вы пытаетесь очистить через пакет мобильного браузера, например мобилизатор Google для сложных веб-сайтов. Это исправит неверный html и позволит вам использовать простой пакет парсеров html dom, но он может не работать, если вам нужна часть информации, которая удалена из сайта. Ниже приведены ссылки на этот адаптер. Я использую это для сайтов, на которых информация плохо отформатирована, или если мне нужен способ упростить форматирование, чтобы было легко разобрать. Html, возвращенный мобилизатором Google, проще и намного проще в обработке.

http://www.google.com/gwt/n