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


23

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

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

누구든지 the_div_id리눅스 명령 줄을 사용하여 파일에서 div 와 모든 하위 요소 및 내용을 추출 할 수있는 방법을 제안 할 수 있습니까 ?

답변:


27

HTML-XML-유틸의 대부분의 주요 리눅스 배포판에서 사용할 수있는 패키지는, HTML 및 XML 문서를 처리 할 때 유용한 도구를 가지고 있습니다. hxselect표준 입력에서 읽고 CSS 선택기를 기반으로 요소를 추출하는 경우가 특히 유용합니다 . 사용 사례는 다음과 같습니다.

hxselect '#the_div_id' <file

당신이 먹이를 먹이는 것에 따라 입력이 잘 형성되지 않았다는 불만이 생길 수 있습니다. 이 불만은 표준 오류에 대한 것이므로 필요한 경우 쉽게 억제 할 수 있습니다. 이에 대한 대안은 Perl의 HTML :: PARSER 패키지를 사용하는 것입니다. 그러나, 나는 Perl 기술을 가진 사람에게 내 것보다 덜 녹슬지 않을 것이다.


1
hxselect보다 입력 형식이 더 까다 롭습니다 pup. 예를 들어, 나는군요 Input is not well-formed. (Maybe try normalize?)와 함께 hxselect 어디 pup그냥 구문 분석.
AB

12

pupHTML 처리를위한 명령 줄 도구를 사용해보십시오 . 예를 들면 다음과 같습니다.

pup '#the_div_id' < file.html

대단해!
CC

4

다음은를 <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.

PS 정규식을 사용하지 마십시오. .



1

각 파일에서 해당 부분을 추출하는 Ex one-liner는 다음과 같습니다.

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

제자리에 저장 / 교체하려면 섹션 -cqa!으로 변경 -cxa하고 제거 %p하십시오. 재귀의 경우 globbing ( **/*.html) 사용을 고려하십시오 .

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

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

POSIX ( :bufdo)가 아닌 매우 효율적이지 않을 수도 있지만 작동해야합니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.