Я пытаюсь очистить данные с веб-сайта с недопустимым 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, проще и намного проще в обработке.