특정 태그를 사용하여 HTML 파일에서 여러 줄 문자열을 추출합니다.

특정 태그를 사용하여 HTML 파일에서 여러 줄 문자열을 추출합니다.

태그로 시작 <span class="style530">하고 </span>태그로 끝나는 문자열을 추출해야 합니다.

sed 명령을 사용했지만 원하는 결과를 얻지 못했습니다. 다음은 샘플 코드입니다.

<strong>
-
<span class="style530">
AA - 
This
is my
First
Heading</span></strong><br>
<span class="style530">
<strong>
*Some
text,*
<strong>
*text*</strong>, 
*text*
<strong>
*text*</strong>: 
<br>
<span class="style530">
<strong>
- This 
is my
Second Heading</strong></span><br>
<span class="style530">
<strong>
*Some
text,*
<strong>
*text*</strong>, 
*Here
is some
text.*
<strong>*text*</strong>: 
*Here is 
some
text*.<br>
<br>
<strong>
-
<span class="style530">
- This is
my Third
Heading</span></strong><br>

출력은 다음과 같아야 합니다.

 AA - This is my First Heading
 - This is my Second Heading
 - This is my Third Heading

감사해요!

답변1

Regex는 실제로 HTML을 완전히 구문 분석할 수 없습니다.

라는 명령줄 도구가 있습니다.자델이를 통해 XPath 또는 CSS 선택기를 사용하여 원하는 부분을 끌어낼 수 있습니다.

다음과 같은 것이 명시된 요구 사항을 충족합니다.

./xidel test.html --extract '//span[@class="style530"]' --output-format bash

그러나 닫히지 않은 출력이 있으므로 필요한 출력보다 더 많은 것을 반환합니다.<span class="style530">

답변2

이러한 작업에는 HTMLParser를 사용하십시오.

#!/usr/bin/python
# vim: set fileencoding=utf8 :
# (c) fazie

from HTMLParser import HTMLParser
import re
import sys

class MyParser(HTMLParser):
    inside_span = False

    def __init__(self,file):
        HTMLParser.__init__(self)
        f = open(file)
        self.feed(f.read())

    def handle_starttag(self,tag,attrs):
        if tag == 'span':
            for name,value in attrs:
                if name=='class' and value=='style530':
                    self.inside_span=True

    def handle_data(self,data):
        data = data.strip(' \t\r\n')
        if data != "":
            if self.inside_span:
                data = re.sub('\n',' ',data)
                data = re.sub('\s\s+',' ',data)
                print data

    def handle_endtag(self,tag):
        if tag == 'span':
            self.inside_span=False

MyParser(sys.argv[1])

실행하세요:

python myparser.py inputfile.html

답변3

아래와 같이 시도해 볼 수 있습니다.

awk -vRS='<' '
  inside || /^span[^>]*class="style530"/ {
    inside = 1
    if (/^span/)
      n++
    else if (/^\/span>/ && !--n) {
      $0="/span>\n"
      inside=0
    }
    printf "<%s", $0
  }' file.html | sed '/^</ d' | grep -v ">$"

그러나 HTML 헤더를 사용하여 추출하는 것은 바람직하지 않습니다. 참조하세요여기HTML 페이지를 구문 분석하면 안되는 이유. HTML 헤더를 사용 curl하고 w3m제거하면 구문 분석이 조금 더 간단해질 것을 제안합니다 .

답변4

xml/html 텍스트에서 간단한 추출을 위해 나는 xidel을 사용하고 싶습니다.CSS 선택기.

이 예에서는 단어가 포함된 span속성을 가진 모든 요소를 ​​선택하려면 다음을 사용할 수 있습니다.classstyle530

xidel --css span.style530 --xml

xidel많은 옵션이 있습니다. 질문에 제공된 입력이 약간 시끄럽습니다. 덜 시끄러운 상황에서는 --xml다음과 같은 결과를 얻을 수 있습니다.

<xml>
  <span class="style530">case 1 </span>
  <span class="menu style530 otherclass">case 2 </span>
  ...
</xml>

관련 정보