HTML синтаксического анализа через XPath

Прежде всего, ваше текущее предложение LIMIT довольно бессмысленно, поскольку в запросе нет предложения ORDER BY. Не ясно , какие 100 записей вы хотите сохранить. Итак, вы можете использовать что-то вроде этого:

SELECT
    l1.datetime,
    l1.id,
    l1.name,
    l1.ip,
    l2.datetime,
    l2.mobile,
    l2.id
FROM log_1 l1
INNER JOIN log_2 l2
    ON l1.id = l2.id AND l1.datetime = l2.datetime
WHERE
    l1.ip = '192.168.100.100'
ORDER BY
    l1.datetime DESC
LIMIT 100;

Это вернет 100 самых последних совпадающих записей. Что касается ускорения этого запроса, один из способов как минимум ускорить объединение - добавить следующий индекс в таблицу log_2:

CREATE INDEX idx ON log_2 (datetime, id, mobile);

Предполагая, что MySQL выберет этот индекс, он должен сделать объединение происходит намного быстрее, потому что каждое значение id и datetime можно искать в B-дереве, а не выполнять ручное сканирование всей таблицы. Обратите внимание, что индекс также охватывает столбец mobile, который необходим для выбора.

27
задан jfs 13 November 2008 в 08:18
поделиться

6 ответов

В Python ElementTidy анализирует суп тега и производит дерево элемента, которое позволяет запрашивать использование XPath:

>>> from elementtidy.TidyHTMLTreeBuilder import TidyHTMLTreeBuilder as TB
>>> tb = TB()
>>> tb.feed("<p>Hello world")
>>> e= tb.close()
>>> e.find(".//{http://www.w3.org/1999/xhtml}p")
<Element {http://www.w3.org/1999/xhtml}p at 264eb8>
7
ответ дан 28 November 2019 в 04:25
поделиться

BeautifulSoup является хорошей библиотекой Python для контакта с грязным HTML в очевидных способах.

5
ответ дан 28 November 2019 в 04:25
поделиться

Похоже, что вопрос можно было бы точнее сформулировать как « Как преобразовать HTML в XML, чтобы выражения XPath могли быть сопоставлены с ним ».

Вот два хороших инструмента:

  1. TagSoup , программа с открытым исходным кодом, является инструментом на основе Java и SAX, разработанный Джон Коуэн . Это SAX-совместимый синтаксический анализатор, написанный на Java, который вместо синтаксического анализа правильно сформированного или корректного XML анализирует HTML так, как он встречается в дикой природе: плохой, неприятный и грубый, хотя довольно часто далеко не короткий. TagSoup предназначен для людей, которые должны обрабатывать эти вещи, используя некое подобие рационального дизайна приложения. Предоставляя интерфейс SAX, он позволяет применять стандартные инструменты XML даже к худшему HTML. TagSoup также включает процессор командной строки, который читает файлы HTML и может генерировать либо чистый HTML, либо правильно сформированный XML, который является близким приближением к XHTML.
    Taggle - это коммерческий порт C ++ для TagSoup.

  2. SgmlReader - это инструмент, разработанный Microsoft Крисом Ловеттом .
    SgmlReader - это API XmlReader поверх любого документа SGML (включая встроенную поддержку HTML). Также предоставляется утилита командной строки, которая выводит правильно сформированный результат XML.
    Загрузите zip-файл, включая автономный исполняемый файл и полный исходный код: SgmlReader.zip

3
ответ дан 28 November 2019 в 04:25
поделиться

Для Ruby я настоятельно рекомендую Hpricot, на который указал Jb Evain. При поиске быстрее находящегося в libxml конкурента Nokogiri (см. http://tenderlovemaking.com/2008/10/30/nokogiri-is-released/ ), довольно хорошо также (это поддерживает и XPath и поиски CSS как Hpricot, но быстрее). Существует основное wiki и [приблизительно 112] сравнительные тесты .

2
ответ дан 28 November 2019 в 04:25
поделиться

Выдающимся достижением является чистый XSLT 2.0 Парсер HTML , написанный Дэвидом Карлайлом .

Чтение его кода было бы отличным учебным упражнением для каждого из нас.

Из описания:

" d: htmlparse (string)
& nbsp; d: htmlparse (строка, пространство имен, html-mode)

& nbsp; & nbsp; & nbsp; Форма с одним аргументом эквивалентна)
& nbsp; & nbsp; & nbsp; d: htmlparse (string, ' http://ww.w3.org/1999/xhtml ', true ()))

& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; анализирует строку с использованием некоторой встроенной эвристики)
& nbsp; & nbsp; & nbsp; ; управляет подразумеваемым открытием и закрытием элементов.

& nbsp; & nbsp; & nbsp; & nbsp; не обладает полным знанием HTML DTD, но имеет полный список
& nbsp; & nbsp; & nbsp; ; пустые элементы и полный список определений сущностей. HTML-сущности и
& nbsp; & nbsp; & nbsp; & nbsp; ссылки на десятичные и шестнадцатеричные символы принимаются. Примечание html-entity
& nbsp; & nbsp; распознаются даже if html-mode = false ().

& nbsp; & nbsp; & nbsp; & nbsp; Имена элементов в нижнем регистре (если html-mode имеет значение true ()) и помещаются в
& nbsp ; & nbsp; пространство имен, указанное в пространстве имен par ameter (который может быть "" для обозначения
& nbsp; & nbsp; & nbsp; no-namespace, если только у входа нет явных объявлений пространства имен, в
& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; ]

& nbsp; & nbsp; Имена атрибутов в нижнем регистре, если html-mode = true ()
"

Более подробное описание здесь . ] .

Надеюсь, что это помогло.

Приветствия,

Димитр Новатчев.

1
ответ дан 28 November 2019 в 04:25
поделиться

Существует бесплатная реализация C для XML, названной libxml2, который имеет некоторые биты API для XPath, который я использовал с большим успехом, который можно определить HTML как загружаемый документ. Это работало на меня для немного меньше, чем идеальные документы HTML..

По большей части, XPath является самым полезным, когда входящий HTML правильно кодируется и может быть считан 'как xml документ'. Можно хотеть рассмотреть использование утилиты, которая характерна для этой цели для чистки документов HTML. Вот один пример: http://tidy.sourceforge.net/

До этих инструментов XPath идет - Вы, вероятно, найдете, что большинство реализаций на самом деле основано на существовании ранее C или библиотеках C++, таких как libxml2.

1
ответ дан 28 November 2019 в 04:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: