WebAPIのレスポンスから任意の要素を取得したい
YAHOOショッピングの商品レビュー検索のWebAPIを使ってレビューの本文を抽出したいです。
XMLファイルを読み取るところまでは多分できていますが、実際に本文のみを抽出することができません。
カテゴリーIDは適当です。
/ResultSet/Result/Descriptionのレスポンスフィールドのみを表示したいのです。
このコードだと最後の行でエラーが出現します。
エラー内容
Traceback (most recent call last):
File "test.py", line 23, in <module>
print(root['./ResultSet/Result/Description'].text)
TypeError: element indices must be integers
プログラム
import urllib.request
import urllib.parse
import xml.etree.ElementTree as ET
params = {
"category_id": "2501"
}
p = urllib.parse.urlencode(params)
u = 'https://shopping.yahooapis.jp/ShoppingWebService/V1/reviewSearch?'
a = 'appid=XXXXXXXXXXXX(自分のID)&'
url = u + a + p
req = urllib.request.Request(url)
with urllib.request.urlopen(req) as response:
xml_string = response.read()
root = ET.fromstring(xml_string)
print(root['./ResultSet/Result/Description'].text)
追記・変更
ElementTreeではなくBeautifulSoupをつかうと本文のみ抽出できるようになりましたが、文章の間にというタグがくっついたまま出力されてしまいます。
変更後コード
import urllib.request
import urllib.parse
from bs4 import BeautifulSoup
params = {
"category_id": "2501"
}
p = urllib.parse.urlencode(params)
u = 'https://shopping.yahooapis.jp/ShoppingWebService/V1/reviewSearch?'
a = 'appid=XXXXXXXXXXX&'
url = u + a + p
req = urllib.request.Request(url)
with urllib.request.urlopen(req) as response:
xml_string = response.read()
soup = BeautifulSoup(xml_string, "xml")
print(soup.find_all("Description"))
出力