タグで始まり<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
正規表現では実際には HTML を完全に解析することはできません。
というコマンドラインツールがありますキシデルXPath または CSS セレクターを使用して必要な部分を取り出すことができます。
次のようなものが、あなたが述べた要件を満たすでしょう:
./xidel test.html --extract '//span[@class="style530"]' --output-format bash
ただし、閉じられていないものが1つあるため、必要な出力よりも多くの出力が返されることに注意してください。<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 ページを解析すべきでない理由については、 を使用しcurl
、w3m
HTML ヘッダーを削除することをお勧めします。その後、解析が少し簡単になります。
答え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>