Ich versuche, ein einfaches Bash-Skript zu schreiben, das Preisinformationen aus den Suchergebnissen der eBay-Entwickler-API analysiert. Hier ist ein Beispiel für XML-Suchergebnisse für „Detective Comics 700“:
<findItemsAdvancedResponse xmlns="http://www.ebay.com/marketplace/search/v1/services">
<ack>Success</ack>
<version>1.12.0</version>
<timestamp>2014-06-21T19:03:49.943Z</timestamp>
<searchResult count="1">
<item>
<itemId>301209856743</itemId>
<title>
DETECTIVE COMICS (1937 Series) #700 Near Mint Comics Book
</title>
<globalId>EBAY-US</globalId>
<primaryCategory>
<categoryId>77</categoryId>
<categoryName>Other</categoryName>
</primaryCategory>
<galleryURL>
http://thumbs4.ebaystatic.com/m/mBYOI1SLUSGe0DL1FmHjdCw/140.jpg
</galleryURL>
<viewItemURL>
http://www.ebay.com/itm/DETECTIVE-COMICS-1937-Series-700-Near-Mint-Comics-Book-/301209856743?pt=US_Comic_Books
</viewItemURL>
<paymentMethod>PayPal</paymentMethod>
<paymentMethod>VisaMC</paymentMethod>
<paymentMethod>Discover</paymentMethod>
<autoPay>false</autoPay>
<location>USA</location>
<country>US</country>
<shippingInfo>
<shippingServiceCost currencyId="USD">4.95</shippingServiceCost>
<shippingType>Flat</shippingType>
<shipToLocations>Worldwide</shipToLocations>
<expeditedShipping>true</expeditedShipping>
<oneDayShippingAvailable>false</oneDayShippingAvailable>
<handlingTime>3</handlingTime>
</shippingInfo>
<sellingStatus>
<currentPrice currencyId="USD">6.0</currentPrice>
<convertedCurrentPrice currencyId="USD">6.0</convertedCurrentPrice>
<sellingState>Active</sellingState>
<timeLeft>P17DT7H31M1S</timeLeft>
</sellingStatus>
<listingInfo>
<bestOfferEnabled>false</bestOfferEnabled>
<buyItNowAvailable>false</buyItNowAvailable>
<startTime>2014-06-09T02:34:50.000Z</startTime>
<endTime>2014-07-09T02:34:50.000Z</endTime>
<listingType>StoreInventory</listingType>
<gift>false</gift>
</listingInfo>
<returnsAccepted>true</returnsAccepted>
<galleryPlusPictureURL>
http://galleryplus.ebayimg.com/ws/web/301209856743_1_0_1.jpg
</galleryPlusPictureURL>
<isMultiVariationListing>false</isMultiVariationListing>
<topRatedListing>false</topRatedListing>
</item>
</searchResult>
<paginationOutput>
<pageNumber>1</pageNumber>
<entriesPerPage>1</entriesPerPage>
<totalPages>111</totalPages>
<totalEntries>111</totalEntries>
</paginationOutput>
<itemSearchURL>
http://www.ebay.com/sch/63/i.html?LH_TitleDesc=1&_nkw=detective+comics+700&_ddo=1&_ipg=1&_pgn=1
</itemSearchURL>
</findItemsAdvancedResponse>
Ich möchte im Wesentlichen nur den Titel, den Preis und möglicherweise die Versandkosten analysieren.
Vorläufige Untersuchungen haben ergeben, dass dies xmlstarlet
in diesem Fall eine sinnvolle Wahl ist, aber es funktioniert nicht (ich weiß, dass ich etwas falsch mache).
Wenn ich eine Suche versuche, erhalte ich kein Ergebnis:
[foouser@foobox fooapp]# cat xmlsample | xmlstarlet sel -t -v "//title"
[foouser@foobox fooapp]#
[foouser@foobox fooapp]# xmlstarlet sel -t -v "//findItemsAdvancedResponse/searchResult/item/title" xmlsample
[foouser@foobox fooapp]#
Irgendwelche Ideen, wo ich vom Weg abgekommen bin?
Antwort1
Beim Versuch, Ihre Schritte zu reproduzieren, treten zwei Probleme auf:
EntityRef: expecting ';'
Es sieht so aus, als ob das Quelldokument dort verwendet, &
wo es verwenden sollte &
.
Ich habe das mithilfe von behoben sed -i -e 's/&/&/g' xmlresult
.
None of the XPaths matched; to match a node in the default namespace use '_' as the prefix (see section 5.1 in the manual).
GefolgtAbschnitt 5.1, ich habe versucht, es der XPath-Abfrage hinzuzufügen -N services=http://www.ebay.com/marketplace/search/v1/services
und einzufügen services:
, und jetzt erhalte ich etwas Nützliches.
$ xmlstarlet sel -N services=http://www.ebay.com/marketplace/search/v1/services -t -v '//services:title' result.xml
DETECTIVE COMICS (1937 Series) #700 Near Mint Comics Book