2010-09-24 2 views
1

Я искал решение этой проблемы в течение довольно долгого времени, но я не могу понять это самостоятельно.awk возвращает родительское значение тега HTML, если его дочерний тег соответствует совпадению - возможно?

У меня есть куча HTML-блоков кода, и я хочу найти определенную строку, содержащуюся в одном из внутренних тегов, и если есть совпадение, я хочу вернуть значение родительского тега. Вот пример»

<li rel="Returns this value"> 
    <some other tags and elements here /> 
    <a class="link"><span>This match</span></a> 
</li> 

Мы ищем строку This match, и он вернется Returns this value. Возможно ли это в AWK? Если нет, то самый простой способ сделать это? Я не против какого-либо решения, однако AWK или аналогичную команду я использую сервер Ubuntu, и у меня есть root-доступ, поэтому при необходимости я мог бы полагаться на другие языки, такие как Ruby, Python, Perl, PHP и т. д.

До сих пор я мы смогли найти строку между тегами span и вернуть ее содержимое. Однако с простой командой sed можно было бы сделать намного проще, поэтому для нее пока мало пользы. Однако она может быть полезной и может совершенствоваться чтобы сделать то, что мне нужно сделать, так что здесь идет:

awk 'BEGIN{RS="";FS="</span>"} 
/li/{ 
for(i=1;i<=NF;i++){ 
    if($i ~ /span/){ 
     gsub(/.*span>/,"",$i) 
     print $i 
    }  
} 
}' 

При использовании на приведенном выше примере, он возвращает This match. Большое спасибо за предложения.

ответ

2

В общем you can't parse html with regular expressions.

Это не означает, что вы не можете разобрать HTML в AWK, хотя это будет большая работа, и я никогда не слышал о тех, кто делает это.

Если ваши цели четко определены, а вход очень равномерен, и вы можете гарантировать определенные вещи о вложенности тегов во входные данные, вы можете управлять им.

Однако, по большей части, awk является неправильным инструментом для работы. Лучше выбрать язык, на котором доступен механизм синтаксического анализа HTML, и использовать его. Perl, python, php, ruby ​​... много вариантов.