수백 개의 HTML 소스 코드 파일이 있습니다. 각 파일에서 특정 요소의 콘텐츠를 추출해야 하므로 <div>
각 파일을 반복하는 스크립트를 작성하겠습니다. 요소 구조는 다음과 같습니다.
<div id='the_div_id'>
<div id='some_other_div'>
<h3>Some content</h3>
</div>
</div>
the_div_id
Linux 명령줄을 사용하여 파일에서 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
), 하지만 작동해야 합니다.