두 태그 사이의 텍스트 <tr> </tr>html 문서에서 –이

<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

어떻게해야합니까?



답변

당신 ...이 모든 <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을 확인하십시오. (일반적이지는 않지만 가능) 존재하는 경우 존재하지 않는 것으로 변경하십시오.


답변

HTML 파서를 보증하는 요구 사항이 있습니다. HTML을 구문 분석해야합니다. Perl의 HTML :: TreeBuilder , Python의 BeautifulSoup 등은 사용하기 쉽고 복잡하고 부서지기 쉬운 정규 표현식을 작성하는 것보다 쉽습니다.

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

답변

sed그리고 awk물론이 작업에 적합하지 않습니다, 당신은 오히려 적절한 HTML 파서를 사용해야합니다. 예를 들어 hxselectw3.org에서 :

<htmlfile hxselect -s '\n' -c 'tr'

답변

ruby사용 가능한 경우 다음을 수행 할 수 있습니다

ruby -e 'puts readlines.join[/(?<=<tr>).+(?=<\/tr>)/m].gsub(/<\/?tr>/, "")' file

file입력 HTML 파일은 어디에 있습니까 ? 이 명령은 Ruby one-liner를 실행합니다. 먼저 모든 행을 읽고 file문자열에 조인합니다 readlines.join. 그런 다음, 문자열에서 (그러나 포함하지 않음) 사이에 그것을 선택 아무것도 <tr><\/tr>그 이상에 관계없이 줄 바꿈 한 문자 또는이다 [/(?<=<tr>).+(?=<\/tr>)/m]. 그런 다음 문자열에서 <tr>또는 </tr>문자열을 제거합니다 gsub(/<\/?tr>/, "")(중첩 tr태그 를 처리하는 데 필요함 ). 마지막으로 문자열을 인쇄합니다 puts.

당신은 HTML 파서 당신을 위해 보증하지 않고, 아주 쉽게 사용할 수 있다고 말했다 노코 기리을 함께 ruby하고 명령 간단합니다.

ruby -rnokogiri -e 'puts Nokogiri::HTML(readlines.join).xpath("//tr").map { |e| e.content }' file

-rnokogiri노코 기리 Nokogiri::HTML(readlines.join)의 모든 줄을 읽습니다 file. xpath("//tr")모든 밖으로 픽 tr요소 map { |e| e.content }사이에 무엇인지, 즉 각 요소에 대한 내용 밖으로 추천 <tr>하고 </tr>.


답변

grep

tr여러 줄의 태그 내에서 내용을 검색하려면 xargs먼저 다음과 같이 전달하십시오 .

curl -sL https://www.iana.org/ | xargs | egrep -o "<tr>.*?</tr>"

내부 HTML 만 반환하려면 다음을 사용하십시오.

curl -sL https://www.iana.org/ | xargs | grep -Po "<tr>\K(.*?)</tr>" | sed "s/..tr.//g"

perlre확장 패턴 구문을 확인하십시오 .

참고 : 더 빠른 성능을 위해 ripgrep유사한 구문을 사용하는 것을 고려할 수 있습니다 .


답변

pup

pup( CSS 선택기 를 사용하는) 예제 :

pup -f myfile.html tr

태그가없는 텍스트 만 인쇄하려면 다음을 사용하십시오 pup -f myfile.html tr text{}.

다음은 몇 가지 예입니다 curl.

curl -sL https://www.iana.org/ | pup tr text{}
pup -f <(curl -sL https://www.iana.org/) tr text{}

xpup

xpupXPath를 지원하는 HTML / XML 구문 분석을 사용 하는 예 :

xpup -f myfile.html "//tr"

답변

<tr>s 의 빠른 목록 인 경우 도움이 될 수 있습니다.

perl -ne 'print if /<tr>/../</tr>/' your.html > TRs.log

건배