Извлечение нескольких строк из файла HTML с использованием определенных тегов

Мне нужно извлечь строку, которая начинается с тега <span class="style530"> и заканчивается </span> .

Я использовал команду sed, но не получил желаемого результата. Ниже приведен пример кода:

 <strong> - <span class="style530"> AA - This is my First Heading</span></strong><br> <span class="style530"> <strong> *Some text,* <strong> *text*</strong>, *text* <strong> *text*</strong>: <br> <span class="style530"> <strong> - This is my Second Heading</strong></span><br> <span class="style530"> <strong> *Some text,* <strong> *text*</strong>, *Here is some text.* <strong>*text*</strong>: *Here is some text*.<br> <br> <strong> - <span class="style530"> - This is my Third Heading</span></strong><br> 

Результат должен выглядеть следующим образом:

  AA - This is my First Heading - This is my Second Heading - This is my Third Heading 

Благодаря!

3 Solutions collect form web for “Извлечение нескольких строк из файла HTML с использованием определенных тегов”

Regex на самом деле не способен полностью анализировать html.

Существует инструмент командной строки, называемый xidel, который позволяет использовать селекторы XPath или CSS, чтобы вытащить нужные вам биты.

Что-то вроде этого соответствовало бы вашему заявленному требованию:

 ./xidel test.html --extract '//span[@class="style530"]' --output-format bash 

Но обратите внимание, что это возвращает больше, чем ваш требуемый вывод, поскольку у вас есть один незакрытый <span class="style530">

Используйте HTMLParser для таких действий:

 #!/usr/bin/python # vim: set fileencoding=utf8 : # (c) fazie from HTMLParser import HTMLParser import re import sys class MyParser(HTMLParser): inside_span = False def __init__(self,file): HTMLParser.__init__(self) f = open(file) self.feed(f.read()) def handle_starttag(self,tag,attrs): if tag == 'span': for name,value in attrs: if name=='class' and value=='style530': self.inside_span=True def handle_data(self,data): data = data.strip(' \t\r\n') if data != "": if self.inside_span: data = re.sub('\n',' ',data) data = re.sub('\s\s+',' ',data) print data def handle_endtag(self,tag): if tag == 'span': self.inside_span=False MyParser(sys.argv[1]) 

Запустить его:

 python myparser.py inputfile.html 

Вы можете попробовать что-то вроде ниже.

 awk -vRS='<' ' inside || /^span[^>]*class="style530"/ { inside = 1 if (/^span/) n++ else if (/^\/span>/ && !--n) { $0="/span>\n" inside=0 } printf "<%s", $0 }' file.html | sed '/^</ d' | grep -v ">$" 

Тем не менее, нецелесообразно извлекать с использованием заголовков HTML. Пожалуйста, смотрите здесь, почему вы не должны анализировать HTML-страницы. Я бы предложил вам использовать curl и w3m для удаления заголовков HTML, после чего синтаксический анализ станет немного проще.

  • Принудительная рысь или elinks для интерпретации пробелов и разрывов строк
  • неудача перенаправления для программы CGI
  • Sed: замена ввода текста
  • Переменная Bash в html
  • Могу ли я добавить тип файла Twig в Linux?
  • Как я могу использовать awk для извлечения URL из HTML-файла?
  • Получить apache для обслуживания Markdown как HTML
  • Sed: поиск и замена паттенов специальными символами, которые имеют произвольную строку между
  • Firefox всегда открывается за вызов программы
  • Создать в HTML из вывода скрипта bash
  • Попытка получить динамическую страницу с wget без успеха
  • Linux и Unix - лучшая ОС в мире.