Почему HTML :: фрагмент не работает, но :: XML работает? - PullRequest
0 голосов
/ 24 апреля 2020

Я пытался выполнить некоторую обработку для некоторых HTML фрагментов, при этом с Нокогири я столкнулся с проблемой, которую, похоже, не могу понять.

Я использую этот код:

doc = Nokogiri::HTML::fragment xml

doc.search("//text()[contains(.,'#{@wordbefore}')]").each do |node|
  node.replace(node.content.gsub(/#{@wordbefore}/, ''))
end

С этим кодом весь блок пропускается. Тем не менее, если я использую:

doc = Nokogiri::XML xml

, это работает. Я пытался разобраться, почему это так, а что нет. Поскольку я действительно передаю фрагменты кода и не хочу, чтобы внутренние элементы кодировались, или пространство имен XML для каждого фрагмента, я действительно хотел бы сохранить это как фрагмент HTML ::. Но не могу определить, является ли это ошибкой, с которой я столкнулся или просто что-то делаю не так.

Обновление: вот все, что я настроил на своем тесте для начала. Еще одно примечание. Я понимаю, что это убьет то, что в элементе термина. На самом деле этой части нет, когда она запускается, так как она изменилась на другом этапе, но для меня это был самый простой способ получить реальный контент.

xml = <<-EOXML
<p dir="ltr" class="FM_Body">The Cortex-A5 MPCore processor is a high-performance, low-power, ARM macrocell with an L1 cache subsystem that provides full virtual memory capabilities. Up to four individual cores can be linked in a cache-coherent cluster, under the control of a <term>Snoop Control Unit</term> (SCU), that maintains L1 data cache coherency for memory marked as shared. The Cortex-A5 MPCore processor implements the ARMv7 architecture and runs 32-bit ARM instructions, 16-bit and 32-bit Thumb instructions, and 8-bit Java<tm tmtype="tm">Java</tm> bytecodes in Jazelle state.</p>
EOXML

doc = Nokogiri::XML xml
@wordbefore = "Java"

doc.search("//text()[contains(.,'#{@wordbefore}')]").each do |node|
 node.replace(node.content.gsub(/#{@wordbefore}/, ''))
end

p doc.to_xml

1 Ответ

0 голосов
/ 24 апреля 2020

Люди, которые поддерживают Нокогири, вернулись ко мне. Оказывается, это известная проблема с HTML фрагментами и поиском по Xpath. В моем конкретном случае решение состоит в том, чтобы go вверх по дереву через .//text() вместо просто //text().

...