<span class="style530">
tag 로 시작하고 tag 로 끝나는 문자열을 추출해야 합니다 </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
정규식은 실제로 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
속성에 단어가 포함된 모든 요소를 선택하려면 다음을 사용할 수 있습니다.class
style530
xidel --css span.style530 --xml
xidel
많은 옵션이 있습니다. 질문에서 제공하는 입력이 약간 시끄럽습니다. 노이즈가 적으면 --xml
비슷한 결과를 얻을 수 있습니다.
<xml>
<span class="style530">case 1 </span>
<span class="menu style530 otherclass">case 2 </span>
...
</xml>