셸에서 수백 개의 HTML 소스 코드 파일을 구문 분석하는 방법은 무엇입니까?

셸에서 수백 개의 HTML 소스 코드 파일을 구문 분석하는 방법은 무엇입니까?

수백 개의 HTML 소스 코드 파일이 있습니다. 각 파일에서 특정 요소의 콘텐츠를 추출해야 하므로 <div>각 파일을 반복하는 스크립트를 작성하겠습니다. 요소 구조는 다음과 같습니다.

<div id='the_div_id'>
  <div id='some_other_div'>
  <h3>Some content</h3>
  </div>
</div>

the_div_idLinux 명령줄을 사용하여 파일에서 div와 모든 하위 요소 및 콘텐츠를 추출할 수 있는 방법을 제안할 수 있는 사람이 있습니까?

답변1

이것html-xml-utils이 패키지는 대부분의 주요 Linux 배포판에서 사용할 수 있으며 HTML 및 XML 문서 작업에 유용한 많은 도구를 포함하고 있습니다. 귀하의 경우에 특히 유용한 점은 hxselect표준 입력에서 읽고 CSS 선택기를 기반으로 요소를 추출한다는 것입니다. 사용 예는 다음과 같습니다.

hxselect '#the_div_id' <file

귀하가 제공한 내용에 따라 잘못된 입력 형식에 대한 불만이 제기될 수 있습니다. 이 불만 사항은 표준 오류에 대해 제공되므로 필요한 경우 쉽게 억제할 수 있습니다. 대안은 Perl의 HTML::PARSER 패키지를 사용하는 것입니다. 그러나 저는 이 작업을 저보다 Perl 기술이 덜 녹슬었던 사람에게 맡길 것입니다.

답변2

노력하다pup, HTML 처리를 위한 명령줄 도구입니다. 예를 들어:

pup '#the_div_id' < file.html

답변3

<div id="the_div_id">이것은 요소와 그 내용을 추출하는 테스트되지 않은 Perl 스크립트입니다.HTML::TreeBuilder.

#!/usr/bin/env perl
use strict;
use warnings;
use HTML::TreeBuilder;
foreach my $file_name (@ARGV) {
    my $tree = HTML::TreeBuilder->new;
    $tree->parse_file($file_name);
    for my $subtree ($tree->look_down(_tag => "div", id => "the_div_id")) {
        my $html = $subtree->as_HTML;
        $html =~ s/(?<!\n)\z/\n/;
        print $html;
    }
    $tree = $tree->delete;
}

Perl에 알레르기가 있는 경우 Python에는HTMLParser.

폴리스티렌정규식을 사용하려고 하지 마세요..

답변4

다음은 각 파일에서 해당 섹션을 추출하는 이전 줄입니다.

ex -s +'bufdo!/<div.*id=.the_div_id/norm nvatdggdG"2p' +'bufdo!%p' -cqa! *.html

그 자리에 저장/교체하려면 섹션을 변경 -cqa!하고 -cxa삭제하세요 . %p재귀의 경우 와일드카드( **/*.html) 사용을 고려하세요.

기본적으로 각 버퍼/파일( bufdo)에 대해 다음을 수행합니다.

  • /pattern- 패턴 찾기
  • norm- 일반 Vi 키 입력 시뮬레이션을 시작합니다.
    • n- 다음 모드로 이동(Ex 모드에서 필요)
    • vatd- 선택한 외부 라벨 섹션을 제거합니다(참조:HTML 태그 간 이동)
    • ggdG- 전체 버퍼 삭제( 와 동일 :%d)
    • "2p- 이전에 삭제한 텍스트를 다시 붙여넣습니다.

아마도 그다지 효율적이지 않을 수도 있고,POSIX( :bufdo), 하지만 작동해야 합니다.

관련 정보