2013-07-30 3 views
2

У меня проблема, и мне нужно найти быстрое решение.Удалите определенные теги, если они находятся внутри определенного тега

Я хочу удалить теги «br» и «p» внутри всех «таблиц», но не снаружи.

Для примера.

Первоначальный документ HTML:

... 
<p>Hello</p> 
<table> 
    <tr> 
    <td><p>Text example <br>continues...</p></td> 
    <td><p>Text example <br>continues...</p></td> 
    <td><p>Text example <br>continues...</p></td> 
    <td><p>Text example <br>continues...</p></td> 
    </tr> 
</table> 
<p>Bye<br></p> 
<p>Bye<br></p> 
... 

Моя цель:

... 
<p>Hello</p> 
<table> 
    <tr> 
    <td>Text example continues...</td> 
    <td>Text example continues...</td> 
    <td>Text example continues...</td> 
    <td>Text example continues...</td> 
    </tr> 
</table> 
<p>Bye<br></p> 
<p>Bye<br></p> 
... 

Теперь, вот мой способ очистки:

loop do 
    if html.match(/<table>(.*?)(<\/?(p|br)*?>)(.*?)<\/table>/) != nil 
    html = html.gsub(/<table>(.*?)(<\/?(p|br)*?>)(.*?)<\/table>/,'<table>\1 \4</table>') 
    else 
    break 
    end 
end 

То работает, но проблема в том, У меня есть документы 1xxx, и у каждого есть около 1000 строк ... и занимает 1-3 часа каждый. ((1-3 часа) * (тысячи документов)) = ¡боль!

Мне кажется, что это делается с помощью санитаза или другого метода, но ... на данный момент ... Я не нахожу пути.

Может кто-нибудь мне помочь?

Спасибо заранее! Ману

+1

http://stackoverflow.com/a/1732454/438992 Другими словами, использовать фактический HTML-парсер , –

+3

^Чтобы добавить к рассмотренному выше, изучите использование 'Nokogiri' для этого. –

+0

** Не используйте регулярные выражения для анализа HTML. Используйте подходящий модуль синтаксического анализа HTML. ** Вы не можете надежно проанализировать HTML с регулярными выражениями, и вы столкнетесь с печалью и разочарованием в будущем. Как только HTML изменится с ваших ожиданий, ваш код будет сломан. См. Http://htmlparsing.com/ruby о примерах правильного анализа HTML с помощью модулей Ruby, которые уже были написаны, протестированы и отлажены. –

ответ

4

Использование Nokogiri:

require 'nokogiri' 

doc = Nokogiri::HTML::Document.parse <<-_HTML_ 
<p>Hello</p> 
<table> 
    <tr> 
    <td><p>Text example <br>continues...</p></td> 
    <td><p>Text example <br>continues...</p></td> 
    <td><p>Text example <br>continues...</p></td> 
    <td><p>Text example <br>continues...</p></td> 
    </tr> 
</table> 
<p>Bye<br></p> 
<p>Bye<br></p> 
_HTML_ 

doc.xpath("//table/tr/td/p").each do |el| 
    el.replace(el.text) 
end 

puts doc.to_html 

Выход:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd"> 
<html><body> 
<p>Hello</p> 
<table><tr> 
<td>Text example continues...</td> 
    <td>Text example continues...</td> 
    <td>Text example continues...</td> 
    <td>Text example continues...</td> 
    </tr></table> 
<p>Bye<br></p> 
<p>Bye<br></p> 
</body> 
</html> 
+0

Теги абзаца также необходимо удалить из таблицы. –

+0

@JustinKo Ok .. упустил это .. дайте мне несколько минут .. –

+0

@JustinKo я сделан .... –

Смежные вопросы