none
Удалить "ненужное" с html страницы средствами powershell RRS feed

  • Вопрос

  • Есть html файл, например такого вида:

    <html>
       <head>
          <title>Some Text 1</title>
       </head>
       <body>
          <div>
             <p>Some Text 2</p>
             <p>Some Text 3</p>
             <div>
                <p>Some Text 4</p>
                <p>Some Text 5</p>
                <p>Some Text 6</p>
                <p>Some Text 7</p>
             </div>
          </div>
       </body>
    </html>

    Необходимо из него удалить определённые фрагменты (строки таблиц, параграфы и т.д.) - все фрагменты обязательно заключены между тэгами (т.е. не требуется удалять\заменять что-то внутри тэгов). 

    Например: нужно вырезать параграф, в котором содержится некая уникальная и известная фраза "Some Text 6",

    т.е. удалить данные 

    <p>Some Text 6</p>

    Если это тэг последнего уровня, то тут всё просто с оператором (-replace). Но если внутри тэга вложено неизвестное количество других и точно таких же тэгов (и открывающихся и закрывающихся). Как указать скрипту где находится конец удаляемых данных (закрывающий тэг нужного нам уровня)?

    Решение представляю так: разбить html файл на фрагменты по тэгам (включая тэги). 1й элемент содержит весь файл с тэгами <html>, 2-й всё содержимое тэга <head> вместе с ним, 3-й всё содержимое тэга <body> вместе с ним и дальше в глубь.

    Далее с помощью -replace удалить из 1-го элемента целые фрагменты совпавшие по критерию.

    Только как разбить html на подобные фрагменты?

Ответы

  • Довольно сложно заниматься парсингом Html,но как вариант,можно попробовать через xml:

    [xml]$x = @"
    <html>
       <head>
          <title>Some Text 1</title>
       </head>
       <body>
          <div>
             <p>Some Text 2</p>
             <p>Some Text 3</p>
             <div>
                <p>Some Text 4</p>
                <p>Some Text 5</p>
                <p>Some Text 6</p>
                <p>Some Text 7</p>
             </div>
          </div>
       </body>
    </html>
    "@
    
    $x.GetElementsByTagName("p") | Where {$_."#text" -eq "Some Text 6"} | %{$_.ParentNode.RemoveChild($_)}
    $x.save("1.html")
    
    PS >  gc 1.html
    <html>
      <head>
        <title>Some Text 1</title>
      </head>
      <body>
        <div>
          <p>Some Text 2</p>
          <p>Some Text 3</p>
          <div>
            <p>Some Text 4</p>
            <p>Some Text 5</p>
            <p>Some Text 7</p>
          </div>
        </div>
      </body>
    </html>

    • Помечено в качестве ответа MoxFulder 30 мая 2013 г. 5:43
    Отвечающий