Текст между двумя тегами

Существует ошибка панели запуска о Ubuntu, загружающейся с подсветкой ноутбука прочь; это могло бы быть проблемой, которую Вы видите.

24
03.09.2016, 04:23
7 ответов

Если Вы только хотите ... из всех <tr>...</tr> сделайте:

grep -o '<tr>.*</tr>' HTMLFILE | sed 's/\(<tr>\|<\/tr>\)//g' > NEWFILE

Поскольку мультилиния делает:

tr "\n" "|" < HTMLFILE | grep -o '<tr>.*</tr>' | sed 's/\(<tr>\|<\/tr>\)//g;s/|/\n/g' > NEWFILE

Проверьте HTMLFILE сначала символа "|" (не обычный, но возможный) и если он существует, изменение в том, которое не существует.

15
27.01.2020, 19:41
  • 1
    Это будет только работать, если запуск и конечные тэги будут на той же строке. –  l0b0 13.02.2013, 14:01
  • 2
    echo "bla<tr>foo</tr>bla<tr>bar</tr>bla" | grep -o '<tr>.*</tr>' | sed 's/\(<tr>\|<\/tr>\)//g' дает fooblabar. bla не должен ли быть? –  N.N. 13.02.2013, 14:03
  • 3
    @l0b0. пойдет для совместимого с мультилинией... –  xx4h 13.02.2013, 14:07
  • 4
    grep -Po '<tr>.*?</tr>' возвратил бы один результат на строку в случае @N.N., но это не портативно. –  l0b0 13.02.2013, 14:15
  • 5
    я не уверен, что Вы подразумеваете под 'спецификациями' или 'стилем спецификации', но отмечаете, что Ваш веб-браузер использует синтаксический анализатор HTML и синтаксический анализатор HTML, проанализирует HTML независимо от того, как он записан. Это не проанализирует вещи, которые не являются HTML, но затем, ни один не будет Ваш браузер, таким образом, никто не потрудился бы писать "HTML", который не может проанализировать синтаксический анализатор. Другими словами: достойный синтаксический анализатор является абсолютно, конечно, Вашим лучшим выбором для того, чтобы сделать это. –  goldilocks 13.02.2013, 14:38

У Вас действительно есть требование, которое гарантирует синтаксический анализатор HTML: необходимо проанализировать HTML. HTML Perl:: TreeBuilder, BeautifulSoup Python и другие просты в использовании, легче, чем запись сложных и хрупких регулярных выражений.

perl -MHTML::TreeBuilder -le '
    $html = HTML::TreeBuilder->new_from_file($ARGV[0]) or die $!;
    foreach ($html->look_down(_tag => "tr")) {
        print map {$_->as_HTML()} $_->content_list();
    }
' input.html

или

python -c 'if True:
    import sys, BeautifulSoup
    html = BeautifulSoup.BeautifulSoup(open(sys.argv[1]).read())
    for tr in html.findAll("tr"):
        print "".join(tr.contents)
' input.html
11
27.01.2020, 19:41

sed и awk не хорошо подходят для этой задачи, необходимо скорее использовать надлежащий синтаксический анализатор HTML. Например, hxselect из w3.org:

<htmlfile hxselect -s '\n' -c 'tr'
9
27.01.2020, 19:41
  • 1
    , который я не знаю, является ли hxselect лучшим выбором; я не использовал его, но в странице справочника действительно говорится, что это "читает правильно построенный XML-документ", который не много документов HTML. Вероятно, стоящий попытки tho. Синтаксический анализатор HTML освобождает доступный для жемчуга, Python, и. al. будет намного лучше, если это будет опцией. –  goldilocks 13.02.2013, 14:44
  • 2
    @goldilocks: Лучший выбор зависит от ситуации. По моему опыту, hxselect делает довольно хорошее задание с правильно построенными html/xml документами. Кроме того, это быстрее для использования, чем жемчуг, Python и другие. Я думаю hxselect хороший компромисс между sed/awk и синтаксический анализатор освобождает. –  Thor 13.02.2013, 15:00
  • 3
    Если это работает, это является большим! Я просто добавлял протест для TechJack в случае, если он не сделал - так как я также рекомендовал использовать некоторый синтаксический анализатор ;) Lib программирования являются, конечно, более неловкими, но должны иметь дело с чем-либо удаленно проходимым как HTML. –  goldilocks 13.02.2013, 15:56
  • 4
    , hxselect хорошие взгляды, определенно исследует его больше.Спасибо. сам –  TechJack 13.02.2013, 19:16
  • 5
    @goldilocks: hxnormalize заботится о не правильно построенный HTML/XML-файлы. –  tokland 17.11.2016, 13:37

Если ruby доступно, можно сделать следующее

ruby -e 'puts readlines.join[/(?<=<tr>).+(?=<\/tr>)/m].gsub(/<\/?tr>/, "")' file

где file Ваш входной файл HTML. Команда выполняет остроту Ruby. Во-первых, это читает все строки из file и соединяет их со строкой, readlines.join. Затем от строки это выбирает что-либо между (но не включая) <tr> и <\/tr> это - один символ или дольше независимо от новых строк, [/(?<=<tr>).+(?=<\/tr>)/m]. Затем это удаляет любого <tr> или </tr> от строки, gsub(/<\/?tr>/, "") (это необходимо для вложенного дескриптора tr теги). Наконец, это печатает строку, puts.

Вы сказали, что синтаксический анализатор HTML не гарантирован для Вас, но это - очень простой в использовании Nokogiri с ruby и это делает команду более простой.

ruby -rnokogiri -e 'puts Nokogiri::HTML(readlines.join).xpath("//tr").map { |e| e.content }' file

-rnokogiri загрузки Nokogiri. Nokogiri::HTML(readlines.join) чтения все строки file. xpath("//tr") выбирает каждый tr элемент и map { |e| e.content } выбирает содержание для каждого элемента, т.е. между чем <tr> и </tr>.

5
27.01.2020, 19:41

grep

Чтобы получить содержимое внутри тега trпо нескольким строкам, сначала пропустите его через xargs, например:

curl -sL https://www.iana.org/ | xargs | egrep -o "<tr>.*?</tr>"

Чтобы вернуть только внутренний HTML, используйте:

curl -sL https://www.iana.org/ | xargs | grep -Po "<tr>\K(.*?)</tr>" | sed "s/..tr.//g"

Проверьте синтаксис для расширенных шаблоновperlre.

Примечание. :Для повышения производительности вы можете использовать ripgrep, который имеет аналогичный синтаксис.

1
27.01.2020, 19:41

pup

Пример использования pup(, в котором используются селекторы CSS):

pup -f myfile.html tr

Чтобы напечатать только текст без тегов, используйте:pup -f myfile.html tr text{}.

Вот несколько примеров сcurl:

curl -sL https://www.iana.org/ | pup tr text{}
pup -f <(curl -sL https://www.iana.org/) tr text{}

xpup

Пример использованияxpupдля синтаксического анализа HTML/XML (с поддержкой XPath):

xpup -f myfile.html "//tr"
0
27.01.2020, 19:41

если это просто краткий список <tr>s, это может помочь:

perl -ne 'print if /<tr>/../</tr>/' your.html > TRs.log

ура

0
27.01.2020, 19:41

Теги

Похожие вопросы