2017-07-25 11 views
0

TripadvisorページからのXMLファイルがあり、特定のエリアにレストランが表示されます。XMLタグ間で複数の値を抽出します

検索結果に表示されているすべてのレストランから提供されている「料理」を抽出します。すべての値は、<a><span> HTMLタグの間に格納されます。各レストランの

は、データが <div>タグの間保存され、1つのレストランから料理の抜粋を以下に示します。

<div class="cuisines"> 
<span class="item price">££ - £££</span> 
<span class="item cuisine" onclick="ta.restaurant_list_tracking.clickNonLinkedCuisine()">Bar</span> 
<a class="item cuisine" href="/Restaurants-g1096751-c7-Whittlebury_Northamptonshire_England.html" onclick="ta.setEvtCookie('RESTAURANT_DETAILS', 'RESTAURANTS_DETAILS_CUISINE', '', 0, this.href);">British</a> 
<span class="item cuisine" onclick="ta.restaurant_list_tracking.clickNonLinkedCuisine()">Pub</span> 
<span class="item cuisine" onclick="ta.restaurant_list_tracking.clickNonLinkedCuisine()">Gastropub</span> 
<a class="item cuisine" href="/Restaurants-g1096751-zfz10665-Whittlebury_Northamptonshire_England.html" onclick="ta.setEvtCookie('RESTAURANT_DETAILS', 'RESTAURANTS_DETAILS_CUISINE', '', 0, this.href);">Vegetarian Friendly</a> 
<a class="item cuisine" href="/Restaurants-g1096751-zfz10992-Whittlebury_Northamptonshire_England.html" onclick="ta.setEvtCookie('RESTAURANT_DETAILS', 'RESTAURANTS_DETAILS_CUISINE', '', 0, this.href);">Gluten Free Options</a> 
</div> 

がどのように私はそれぞれのこれらのdivタグの間に料理を抽出行くのですレストランを開き、それを新しいテキストファイルに出力しますか?

私はそのコードスニペットから望む予想される出力は次のようになります。あなたは、いくつかの<div>タグは、このXMLファイルである、と私はそれらのすべてを処理したい、抽出

Bar, British, Pub, Gastropub, Vegetarian Friendly, Gluten Free Options 

マインドすべての異なる料理の結果を1つのテキストファイルに変換します。それぞれの行に各<div>ブロックのすべての料理が表示されます。

ありがとうございます!

+0

は、いくつかの[xmlstarletタグ]などのXML処理ツールの研究を行いますライブラリ。 –

+0

本当にXML、またはHTML? (ベースラインのHTML *はXMLのように見えますが、それほどコンプライアントではないため広く利用できるツールでは受け入れられません)。 –

+0

私は、あなた自身のコードを使った援助の要求ではなく、ツールやソリューションの勧告の要求であるように見えるので、この質問を終えるように投票しました。これはあなたの質問をStackOverflowのトピックから外します。その評価が間違っていて、自分でコードを書くのを手助けしたいのであれば、[あなたの質問に今までの仕事を追加](https://stackoverflow.com/posts/45309055/edit)と私は喜んで引っ込めます私の近い投票。 – ghoti

答えて

0

これは、仕事をしていません(awkを使用)基本的なbashスクリプトで、少なくともあなたが提供例:

#!/bin/bash  
cat in.xml | awk ' 
/item cuisine/ {item=gensub(/<[^>]*>/, "", "g"); 
    ans = (ans=="") ? item : ans ", " item;} 
END {print ans}' > out.txt 

スクリプトは括弧内のすべてのテキストを削除し、それらの間のテキストのみを保持し、 "item cuisine"を含む行にのみ表示されます。

しかし、これは非常に壊れやすいXMLファイルから値を抽出する方法、または、そのことについては、任意のデータ交換フォーマット(などJSON、YAMLのような)で、そしてのために働いて停止することができることに注意してください何十もの異なる理由(悪いXMLフォーマット、大括弧の外に "item cuisine"という用語を含むXML行、改行で分けられないXMLタグなど)。

上記のスクリプトを拡張してエラーの数を増やすことはできますが、これは既により良い方法で行われているため、ホイールを再作成する必要はありません。 xmllintまたはxgrepのようなツールは、はるかに堅牢なXML解析機能を提供し、エラー処理の代わりに手元の作業にのみ集中することができます。

これは簡単な個人的なハッキング/実験以上のものであれば、私はすでに利用可能なツールの1つを使用することを強くお勧めします。 XMLStarletを使用して

+0

ありがとう、私は間違いなくXMLの解析のために特別に作られたツールを見ていきます、ありがとう! – Bob

0

、あなたのコンテンツがin.xmlであると仮定すると:または[タグ:xmllint]、または固体のXML解析とPythonやRubyのような言語:

# Generate an array of cuisines 
cuisines=() 
while IFS= read -r cuisine; do 
    cuisines+=("$cuisine") 
done < <(xmlstarlet sel -t \ 
      -m '//div[@class="cuisines"]/*[@class="item cuisine"]' \ 
      -v . -n \ 
      <in.xml) 

# Transform that into a string with a command and space after each item 
printf -v cuisines_str '%s, ' "${cuisines[@]}" 

# Remove the trailing ", " from that string on output 
echo "${cuisines_str%, }" 
関連する問題