2016-02-05 39 views
1

我目前正在嘗試從瓶口亞馬遜api請求的響應提取字符串。 不希望引起Russian hackers to pwn to my webapp,我想用漂亮的湯下麪this small webpage as guide.美麗的湯和寬吻,如何正確解析

我當前的代碼:

import bottlenose as BN 
import lxml 
from bs4 import BeautifulSoup 

amazon = BN.Amazon('MyAmznID','MyAmznSK','MyAmznAssTag',Region='UK', Parser=BeautifulSoup) 
rank = amazon.ItemLookup(ItemId="0198596790",ResponseGroup="SalesRank") 

soup = BeautifulSoup(rank) 

print rank 
print soup.find('SalesRank').string 

這是從瓶輸出的電流是這樣的:

<?xml version="1.0" ?><html><body><itemlookupresponse xmlns="http://webservices.amazon.com/AWSECommerceService/2011-08-01"><operationrequest><httpheaders><header name="UserAgent" value="Python-urllib/2.7"></header></httpheaders><requestid>53f15ff4-3588-4e63-af6f-279bddc7c243</requestid><arguments><argument name="AWSAccessKeyId" value="################"></argument><argument name="AssociateTag" value="#########-##"></argument><argument name="ItemId" value="0198596790"></argument><argument name="Operation" value="ItemLookup"></argument><argument name="ResponseGroup" value="SalesRank"></argument><argument name="Service" value="AWSECommerceService"></argument><argument name="Timestamp" value="2016-02-04T11:05:48Z"></argument><argument name="Version" value="2011-08-01"></argument><argument name="Signature" value="################+##################="></argument></arguments><requestprocessingtime>0.0234130000000000</requestprocessingtime></operationrequest><items><request><isvalid>True</isvalid><itemlookuprequest><idtype>ASIN</idtype><itemid>0198596790</itemid><responsegroup>SalesRank</responsegroup><variationpage>All</variationpage></itemlookuprequest></request><item><asin>0198596790</asin><salesrank>124435</salesrank></item></items></itemlookupresponse></body></html> 

所以瓶鼻部分工作,但湯部分給出了錯誤響應:

Traceback (most recent call last): 
File "/Users/Fuck/Documents/Amazon/Bottlenose_amzn_prog/test.py", line 12, in <module> 
print soup.find(Rank).string 
NameError: name 'soup' is not defined 

我想提取'SalesRank'標籤之間的數字,但失敗。

+0

又如果'BeautifulSoup.soup'? – Clodion

+0

你的意思是>湯= BeautifulSoup.soup(等級),如果沒有。這給了Traceback(最近調用最後一次): 文件「/Documents/Amazon/Bottlenose_amzn_prog/test.py」,第8行,在 soup = BeautifulSoup.soup(等級) AttributeError:類型對象'BeautifulSoup'沒有屬性'湯' –

回答

1

好吧,所以我忽略了在bottlenose行中指定解析器的選項。 而只是稍後指定使用BeautifulSoup和xml解析。

import bottlenose as BN 
import lxml 
from bs4 import BeautifulSoup 

amazon = BN.Amazon('##############','##############','##########',Region='UK') 
rank = amazon.ItemLookup(ItemId="specifiedItemId",ResponseGroup="SalesRank") 
soup = BeautifulSoup(rank, "xml") 
print " " 
print soup.SalesRank 

我是一個相當新手的Python用戶,所以有時它簡單的東西,讓我。

1

從看the code看來,Bottlenose Parser選項非常簡單,並且以函數作爲參數。

所以,你可以做一個非常簡單的Python功能,並把它傳遞給構造,這使得你的代碼是這樣的:

import bottlenose as BN 
from bs4 import BeautifulSoup 

def parse_xml(text): 
    return BeautifulSoup(text, 'xml') 

amazon = BN.Amazon(
    AWS_ACCESS_KEY_ID,AWS_SECRET_ACCESS_KEY, 
    AWS_ASSOCIATE_TAG,Region='UK', Parser=parse_xml 
) 
results = amazon.ItemLookup(ItemId="0198596790",ResponseGroup="SalesRank") 

print results.find('SalesRank').string 

或者你可以使用lambda內聯函數來代替:

import bottlenose as BN 
from bs4 import BeautifulSoup 

amazon = BN.Amazon(
    AWS_ACCESS_KEY_ID,AWS_SECRET_ACCESS_KEY,AWS_ASSOCIATE_TAG, 
    Region='UK', Parser=lambda text: BeautifulSoup(text, 'xml') 
) 
results = amazon.ItemLookup(ItemId="0198596790",ResponseGroup="SalesRank") 

print results.find('SalesRank').string