Nano Hash - криптовалюты, майнинг, программирование

Как найти текст за границами тегов HTML?

У меня есть такой HTML:

<div>Lorem ipsum <b>dolor sit</b> amet.</div>

Как я могу найти совпадение на основе простого текста для моей строки поиска ipsum dolor в этом HTML? Мне нужны указатели на начальный и конечный узлы XPath для совпадения, а также индексы символов, чтобы указывать на эти начальные и конечные узлы. Я использую Nokogiri для работы с DOM, но подойдет любое решение для Ruby.

Сложность:

  • Я не могу node.traverse {|node| … } просматривать DOM и выполнять поиск в виде простого текста всякий раз, когда встречается текстовый узел, потому что моя строка поиска может пересекать границы тегов.

  • Я не могу выполнить обычный текстовый поиск после преобразования HTML в обычный текст, потому что в результате мне нужны индексы XPath.

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


Ответы:


1

Вы можете сделать что-то вроде:

doc.search('div').find{|div| div.text[/ipsum dolor/]}
08.09.2017

2

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

Кроме того, мы реализовали его таким образом, что можно игнорировать лишние (≥2) пробельные символы в строке. Вот почему мы должны искать конец совпадения и не можем просто использовать длину строки поиска/кавычки и начало позиции совпадения: количество пробелов в строке поиска и совпадении поиска может различаться.

doc = Nokogiri::HTML.fragment("<div>Lorem ipsum <b>dolor sit</b> amet.</div>")
quote = 'ipsum dolor'


# (1) Find search string in document text, "plain text in plain text".

quote_query = 
  quote.split(/[[:space:]]+/).map { |w| Regexp.quote(w) }.join('[[:space:]]+')

start_index = doc.text.index(/#{quote_query}/i)
end_index = start_index+doc.text[/#{quote_query}/i].size


# (2) Find XPath values and character indexes for our search match.
# 
# To do this, walk through all text nodes and count characters until 
# encountering both the start_index and end_index character counts 
# of our search match.

start_xpath, start_offset, end_xpath, end_offset = nil
i = 0

doc.xpath('.//text() | text()').each do |x|
  offset = 0
  x.text.split('').each do
    if i == start_index
      e = x.previous
      sum = 0
      while e
        sum+= e.text.size
        e = e.previous
      end
      start_xpath = x.path.gsub(/^\?/, '').gsub(
        /#{Regexp.quote('/text()')}.*$/, ''
      )
      start_offset = offset+sum
    elsif i+1 == end_index
      e = x.previous
      sum = 0
      while e
        sum+= e.text.size
        e = e.previous
      end
      end_xpath = x.path.gsub(/^\?/, '').gsub(
        /#{Regexp.quote('/text()')}.*$/, ''
      )
      end_offset = offset+1+sum
    end
    offset+=1
    i+=1
  end
end

На этом этапе мы можем получить нужные значения XPath для начала и окончания поиска (и, кроме того, смещения символов, указывающие на точный символ внутри назначенного элемента XPath для начала и окончания поиска). Мы получили:

puts start_xpath
  /div
puts start_offset
  6
puts end_xpath
  /div/b
puts end_offset
  5
11.09.2017
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..