2010-06-13 2 views
1

Противоположное может быть достигнуто с помощью Pyparsing следующим образом:Strip текст, кроме как от содержимого тега

from pyparsing import Suppress, replaceWith, makeHTMLTags, SkipTo 
#... 
removeText = replaceWith("") 
scriptOpen, scriptClose = makeHTMLTags("script") 
scriptBody = scriptOpen + SkipTo(scriptClose) + scriptClose 
scriptBody.setParseAction(removeText) 
data = (scriptBody).transformString(data) 

Как я мог сохранить содержимое тега "table"?

ОБНОВЛЕНИЕ 0:

Я пробовал: # держать только таблицы tableOpen, tableClose = makeHTMLTags ("таблица") tableBody = tableOpen + SkipTo (tableClose) + tableClose е = ReplaceWith (tableBody) tableBody.setParseAction (е) данные = (tableBody) .transformString (данные) данные печати

и я получаю что-то вроде этого ...

garbages 
<input type="hidden" name="cassstx" value="en_US:frontend"></form></td></tr></table></span></td></tr></table> 

{<"table"> SkipTo:(</"table">) </"table">} 
<div id="asbnav" style="padding-bottom: 10px;">{<"table"> SkipTo:(</"table">) </"table">} 
</div> 
even more garbages 

ОБНОВЛЕНИЕ 2:

Спасибо Martelli. Что мне нужно:

from pyparsing import Suppress, replaceWith, makeHTMLTags, SkipTo 
#... 
data = 'before<script>ciao<table>buh</table>bye</script>after' 

tableOpen, tableClose = makeHTMLTags("table") 
tableBody = tableOpen + SkipTo(tableClose) + tableClose 
thetable = (tableBody).searchString(data)[0][2] 

print thetable 

ответ

1

Вы можете сначала извлечь таблицу (аналогично тому, как вы теперь экстрагента сценарий, но без удаления конечно ;-), получая thetable строку; то вы извлекаете скрипт, replaceWith(thetable) вместо replaceWith(''). В качестве альтернативы вы можете подготовить более продуманное синтаксическое действие, но простой двухфазный подход выглядит более прямолинейным для меня. Например. (Для сохранения конкретно содержимых в table, а не tableтегов):

from pyparsing import Suppress, replaceWith, makeHTMLTags, SkipTo 
#... 
data = 'before<script>ciao<table>buh</table>bye</script>after' 

tableOpen, tableClose = makeHTMLTags("table") 
tableBody = tableOpen + SkipTo(tableClose) + tableClose 
thetable = (tableBody).searchString(data)[0][2] 

removeText = replaceWith(thetable) 
scriptOpen, scriptClose = makeHTMLTags("script") 
scriptBody = scriptOpen + SkipTo(scriptClose) + scriptClose 
scriptBody.setParseAction(removeText) 
data = (scriptBody).transformString(data) 

print data 

Печатается beforebuhafter (что за пределами тега сценария, с содержимым таблицы тега, зажатым внутри), надеюсь " по желанию".

+0

Проблема в том, что я не знаю, как получить строку 'tabletable'. –

+1

@myle, см. Мое редактирование с примером. Да, 'pyparsing' docs действительно скудны (если, возможно, вы не готовы заплатить за книгу O'Reilly, я думаю) - только серьезный дефект этого опрятного пакета! –

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