2017-07-25 64 views
0

我有一個來自Tripadvisor頁面的XML文件,它顯示了特定區域的餐廳。在XML標籤之間提取多個值

我想提取搜索結果中所有餐廳提供的'美食'。所有的值都存儲在<a><span> HTML標籤之間。

對於每一個餐廳,數據被存儲在<div>標籤之間,從一個餐廳的菜餚的片段如下:

<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標籤爲每個之間提取美食餐廳,然後輸出到一個新的文本文件?

預期輸出我想從代碼段將是:

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

你要知道,有在這個XML文件的幾個<div>標籤,我想通過所有的人來處理,提取所有不同美食的結果合併成一個文本文件。每行顯示每個<div>區塊的所有菜餚。

謝謝!

+0

做一些研究XML處理工具,如[標籤:xmlstarlet]或[標籤:xmllint],或語言如Python或Ruby與固體XML解析庫。 –

+0

真的XML或HTML? (這很重要,因爲雖然基線HTML *看起來像XML,但它不太合規,所以廣泛使用的工具不會接受它)。 –

+0

我已投票結束此問題,因爲它似乎是建議使用工具或解決方案的請求,而不是您自己的代碼的協助請求。這使您的問題脫離了StackOverflow。如果該評估不正確,並且確實需要編寫自己的代碼,請[將您的工作添加到您的問題中](https://stackoverflow.com/posts/45309055/edit),然後我會很高興地收回我的近距離投票。 – ghoti

回答

0

這是一個基本的bash腳本(使用AWK),沒有工作,至少爲你提供的示例:

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

腳本刪除括號內的所有文本以及它們之間僅保留文本,只在包含「物品美食」的線上。

然而,注意,這是從一個XML文件中提取值的非常脆弱的方式,或者,就此而言,任何數據交換格式(如JSON,YAML等),並可能停止工作十幾種不同的原因(壞XML格式,包含括號外的「項目美食」一詞的XML行,未被換行符分隔的XML標籤等)。

人們總是可以擴展上面的腳本並覆蓋越來越多的錯誤,但沒有必要重新發明輪子,因爲這已經以更好的方式完成了。像xmllintxgrep這樣的工具提供了更強大的XML解析功能,讓您只專注於手邊的任務而不是錯誤處理。

如果這不僅僅是一個快速的個人黑客/實驗,我會敦促你使用已有的工具之一。

+0

謝謝,我一定會研究專門用於XML解析的工具,謝謝! – Bob

0

使用XMLStarlet,假設您的內容是在in.xml

# 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%, }"