Извлечение строки из HTML-текста - PullRequest
0 голосов
/ 02 ноября 2019

Я получаю HTML с curl и мне нужно извлечь только второй оператор таблицы . Имейте в виду, что свернутый HTML-файл представляет собой одну строку и не форматируется. Для лучшего объяснения смотрите следующее: (... расшифровывается как больше HTML)

...
<table width="100%" cellpadding="0" cellspacing="0" class="table">
...
</table>
...
#I need to extract the following table
#from here
<table width="100%" cellpadding="4">
...
</table> #to this
...

Я пробовал несколько строк SED до сих пор, и я думаю, что попытка сопоставить вторую таблицу, как это не является гладким способом:

sed -n '/<table width="100%" cellpadding="4"/,/table>/p'

Ответы [ 2 ]

2 голосов
/ 02 ноября 2019

HTML-парсер был бы лучше, но вы можете использовать awk следующим образом:

awk '/<table width="100%" cellpadding="4">/ {f=1} f; /<\/table>/ {f=0}' file
<table width="100%" cellpadding="4">
...
</table> #to this
  • /<table width="100%" cellpadding="4">/ {f=1} когда найден старт, установите флаг f в значение true
  • f;, если флаг f равен true, выполнить действие по умолчанию, напечатать строку.
  • /<\/table>/ {f=0}, когда будет найден конец, снять флажок f, чтобы остановить печать.

Это также можно использовать, но лучше, чем контроль флага:

awk '/<table width="100%" cellpadding="4">/,/<\/table>/' file
<table width="100%" cellpadding="4">
...
</table> #to this
1 голос
/ 02 ноября 2019

Сохраните приведенный ниже скрипт как script.py и запустите его так:

python3 script.py input.html

Этот скрипт анализирует HTML и проверяет атрибуты (width и cellpadding). Преимущество этого подхода состоит в том, что если вы измените форматирование файла HTML, он все равно будет работать, поскольку скрипт анализирует HTML, а не полагается на точное совпадение строк.

from html.parser import HTMLParser
import sys

def print_tag(tag, attrs, end=False):
    line = "<" 
    if end:
        line += "/"
    line += tag
    for attr, value in attrs:
        line += " " + attr + '="' + value + '"'
    print(line + ">", end="")

if len(sys.argv) < 2:
    print("ERROR: expected argument - filename")
    sys.exit(1)

with open(sys.argv[1], 'r', encoding='cp1252') as content_file:
    content = content_file.read()

do_print = False

class MyHTMLParser(HTMLParser):
    def handle_starttag(self, tag, attrs):
        global do_print
        if tag == "table":
            if ("width", "100%") in attrs and ("cellpadding", "4") in attrs:
                do_print = True
        if do_print:
            print_tag(tag, attrs)

    def handle_endtag(self, tag):
        global do_print
        if do_print:
            print_tag(tag, attrs=(), end=True)
            if tag == "table":
                do_print = False

    def handle_data(self, data):
        global do_print
        if do_print:
            print(data, end="")

parser = MyHTMLParser()
parser.feed(content)
...