![두 레이블 사이의 텍스트](https://linux55.com/image/48801/%EB%91%90%20%EB%A0%88%EC%9D%B4%EB%B8%94%20%EC%82%AC%EC%9D%B4%EC%9D%98%20%ED%85%8D%EC%8A%A4%ED%8A%B8.png)
<tr> </tr>
HTML 문서에서 이 두 태그 사이의 모든 콘텐츠를 검색 하고 싶습니다 . 이제 html 파서를 보호하기 위한 특정 html 요구 사항이 없습니다. 나는 단순히 일치하는 것이 필요 <tr>
하고 </tr>
그 사이의 모든 것을 가져오며 여러 개의 가 있을 수 있습니다 tr
. 나는 awk를 시도했고 효과가 있었지만 어떤 이유로 추출한 모든 행에 대해 중복 항목을 제공하게 되었습니다.
awk '
/<TR/{p=1; s=$0}
p && /<\/TR>/{print $0 FS s; s=""; p=0}
p' htmlfile> newfile
이 문제를 어떻게 해야 할까요?
답변1
...
당신이 하고 싶은 경우 <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에서 "|" 문자(흔하지 않지만 가능함)를 확인하고, 있는 경우 존재하지 않는 문자로 변경하세요.
답변2
HTML 파서에 대한 한 가지 요구 사항이 있습니다. 즉, HTML을 구문 분석해야 합니다.진주의HTML::트리빌더, 파이썬아름다운 수프다른 것들은 복잡하고 깨지기 쉬운 정규식을 작성하는 것보다 사용하기 쉽고 쉽습니다.
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
답변3
sed
awk
이 작업에 적합하지 않은 경우 적절한 HTML 파서를 사용해야 합니다 . 예를 들어 hxselect
w3.org의 경우:
<htmlfile hxselect -s '\n' -c 'tr'