2016-03-22 19 views
0

シェルスクリプトでウェブページの特定のコンテンツを解析しようとしています。シェルスクリプトでCURLでHTMLを解析する

<div>タグ内のコンテンツが必要です。

<div class="tracklistInfo"> 
<p class="artist">Diplo - Justin Bieber - Skrillex</p> 
<p>Where Are U Now</p> 
</div> 

私はgrep -E -m 1 -o '<div class="tracklistInfo">'を使用している場合は、履歴書はどのように私はアーティスト(Diplo - Justin Bieber - Skrillex)とどのようにタイトル(Where Are U Now)にアクセスできる唯一の<div class="tracklistInfo">

のですか?

答えて

0

Do not。 HTMLパーサを使用します。たとえば、PythonのBeautifulSoupは使いやすく、これを非常に簡単に行うことができます。

これは、grepの行で動作することを覚えています。このパターンはの行ごとに一致し、の文字列では一致しません。

grep -A2 -E -m 1 '<div class="tracklistInfo">' 

万一出力:あなたが使用することができますどのような

も試合後に行をプリントアウトする-Aある

<div class="tracklistInfo"> 
<p class="artist">Diplo - Justin Bieber - Skrillex</p> 
<p>Where Are U Now</p> 

あなたはそれを配管することで、最後または最後から2番目の行を取得することができます〜tail

$ grep -A2 -E -m 1 '<div class="tracklistInfo">' | tail -n1 
<p>Where Are U Now</p> 

$ grep -A2 -E -m 1 '<div class="tracklistInfo">' | tail -n2 | head -n1 
<p class="artist">Diplo - Justin Bieber - Skrillex</p> 

sed

$ grep -A2 -E -m 1 '<div class="tracklistInfo">' | tail -n1 
Where Are U Now 

$ grep -A2 -E -m 1 '<div class="tracklistInfo">' | tail -n2 | head -n1 | sed 's/<[^>]*>//g' 
Diplo - Justin Bieber - Skrillex 


しかし、これは、気まぐれなブレイクする可能性が高い、と非常にきれいではない、と述べたように。ここでの方法により、BeautifulSoupと同じです:

html = '''<body> 
<p>Blah text</p> 
<div class="tracklistInfo"> 
<p class="artist">Diplo - Justin Bieber - Skrillex</p> 
<p>Where Are U Now</p> 
</div> 
</body>''' 

from bs4 import BeautifulSoup 
soup = BeautifulSoup(html, 'html.parser') 

for track in soup.find_all(class_='tracklistInfo'): 
    print(track.find_all('p')[0].text) 
    print(track.find_all('p')[1].text) 

これもtracklistInfoの複数の行と連携 - xmllintを使用して;-)シェルコマンドに多くの作業が必要であることを

+0

ありがとうございます。 は今、私は、次の再開となりました: フロー・ライダーは、アラウンド(5,4,3,2,1) ザッツパーフェクトを回し が、どのように私は前にスペースを削除することができますか?ニッキー・ジャム エルPERD ó N –

+0

@Fabianはい、これはあなたが使用していない理由は 'カール - エンリケ・イグレシアス:私それは空間の文字が含まれているため とは、私は例えば を動作しないUTF8を使用することができます'/' grep'/'sed'でもHTMLパーサです;-) – Carpetsmoker

+0

oh ok 私はBeautifulSoupを使ってみます。 はピップで...私は美しいインストール ...私はそれを得ることはありません..あなたに –

0
cat - > file.html << EOF 
<div class="tracklistInfo"> 
<p class="artist">Diplo - Justin Bieber - Skrillex</p> 
<p>Where Are U Now</p> 
</div><div class="tracklistInfo"> 
<p class="artist">toto</p> 
<p>tata</p> 
</div> 
EOF 


cat file.html | tr -d '\n' | sed -e "s/<\/div>/<\/div>\n/g" | sed -n 's/^.*class="artist">\([^<]*\)<\/p> *<p>\([^<]*\)<.*$/artist : \1\ntitle : \2\n/p' 
0

を追加:

a='<div class="tracklistInfo"> 
<p class="artist">Diplo - Justin Bieber - Skrillex</p> 
<p>Where Are U Now</p> 
</div>' 

xmllint --html --xpath 'concat(//div[@class="tracklistInfo"]/p[1]/text(), "#", //div[@class="tracklistInfo"]/p[2]/text())' <(echo "$a") 

あなたが得る:

Diplo - Justin Bieber - Skrillex#Where Are U Now 

簡単に分けることができます。