Я хочу получить то, что находится между этими двумя тегами <tr> </tr>
- из HTML-документа. Теперь у меня нет особых требований к html, которые гарантировали бы наличие html-парсера. Мне просто нужно что-то, что соответствует <tr>
и </tr>
получает все промежуточное, и может быть несколько tr
s. Я попробовал awk, который работает, но по какой-то причине он дает мне дубликаты каждой извлеченной строки.
awk '
/<TR/{p=1; s=$0}
p && /<\/TR>/{print $0 FS s; s=""; p=0}
p' htmlfile> newfile
Как это сделать?
shell-script
text-processing
sed
awk
html
TechJack
источник
источник
'/<tr/{p=1}; p; /<\/tr>/{p=0}'
. Опубликуйте пример ввода и ожидаемый вывод, если он не работает.awk
работает, но выдает дубликаты, попробуйте передать выходные данные вашего awk,sort -u
чтобы они отличалисьОтветы:
Если вы только хотите
...
всего,<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 первым из символа "|" (не обычно, но возможно), и если он существует, измените на тот, который не существует.
источник
echo "bla<tr>foo</tr>bla<tr>bar</tr>bla" | grep -o '<tr>.*</tr>' | sed 's/\(<tr>\|<\/tr>\)//g'
даетfooblabar
. Тамbla
не должно быть?grep -Po '<tr>.*?</tr>'
вернул бы один результат на строку в случае @ NN, но он не переносим.У вас есть требование, которое гарантирует анализатор HTML: вам нужно проанализировать HTML. HTML :: TreeBuilder , Python's BeautifulSoup и другие в Perl просты в использовании, проще, чем написание сложных и хрупких регулярных выражений.
или
источник
sed
иawk
не очень хорошо подходят для этой задачи, вы должны использовать правильный анализатор HTML. Напримерhxselect
из w3.org:источник
hxselect
хорошо справляется с хорошо сформированными документами html / xml. Кроме того, он быстрее в использовании, чем Perl, Python и другие. Я думаю, чтоhxselect
это хорошая середина междуsed
/awk
и парсерами.hxselect
хорошо выглядит, обязательно изучу его подробнее. Спасибо.hxnormalize
заботится о не правильно сформированных html / xml файлах.Если
ruby
доступно, вы можете сделать следующеегде
file
ваш входной HTML-файл. Команда выполняет Ruby однострочно. Во-первых, он читает все строкиfile
и соединяет их со строкойreadlines.join
. Затем из строки она выбирает что - нибудь между (но не включая)<tr>
и<\/tr>
что один символ или более независимо от символов новой строки[/(?<=<tr>).+(?=<\/tr>)/m]
. Затем он удаляет любую строку<tr>
или</tr>
строкуgsub(/<\/?tr>/, "")
(это необходимо для обработки вложенныхtr
тегов). Наконец, он печатает строкуputs
.Вы сказали , что HTML - парсер не является оправданным для вас , но это очень простой в использовании Nokogiri с ,
ruby
и это делает команду проще.-rnokogiri
грузы Нокогири.Nokogiri::HTML(readlines.join)
читает все строкиfile
.xpath("//tr")
выбирает каждыйtr
элемент иmap { |e| e.content }
выбирает содержимое для каждого элемента, то есть то, что находится между<tr>
и</tr>
.источник
grep
Чтобы извлечь содержимое из
tr
тега в несколько строк,xargs
сначала пропустите его , например:Чтобы вернуть только внутренний HTML, используйте:
Проверьте синтаксис для
perlre
расширенных шаблонов .Примечание: для более быстрой работы вы можете рассмотреть,
ripgrep
какой из них имеет сходный синтаксис.источник
pup
Пример использования
pup
(который использует селекторы CSS ):Чтобы напечатать только текст без тегов, использование:
pup -f myfile.html tr text{}
.Вот несколько примеров с
curl
:xpup
Пример использования
xpup
для разбора HTML / XML (который поддерживает XPath):источник
если это просто быстрый список
<tr>
s, это может помочь:ура
источник