Sie Regex keine HTML-Parser wie bs4 verwenden verwenden:
from bs4 import BeautifulSoup
h = """<div class="price-display csTile-price">
<span class="sup">$</span>
299
<span class="currency-delimiter">.</span>
<span class="sup">00</span>
</div>"""
soup = BeautifulSoup(h)
amount = soup.select_one("div.price-display.csTile-price span.sup").next_sibling.strip()
die Ihnen:
299
Oder nutzen Sie die currency-delimiter
Spanne und erhalten die vorherige Element:
amount = soup.select_one("span.currency-delimiter").previous.strip()
Welche geben Ihnen das gleiche. Der HTML-Code in Ihrer Frage ist auch dynamisch über Javascript so dass Sie es nicht mit urllib.urlopen
bekommen wird, ist es einfach nicht in der Quelle zurückgegeben.
Sie benötigen etwas wie selen oder um den Ajax Anruf wie folgt nachzuahmen mit requests.
import requests
import json
js = requests.post("http://www.walmart.com/store/ajax/search",
data={"searchQuery":"store=2516&size=18&dept=4044&query=43888060"}).json()
data = json.loads(js['searchResults'])
from pprint import pprint as pp
pp(data)
, dass Sie einige json gibt:
{u'algo': u'polaris',
u'blacklist': False,
u'cluster': {u'apiserver': {u'hostname': u'dfw-iss-api8.stg0',
u'pluginVersion': u'2.3.0'},
u'searchengine': {u'hostname': u'dfw-iss-esd.stg0.mobile.walmart.com'}},
u'count': 1,
u'offset': 0,
u'performance': {u'enrichment': {u'inventory': 70}},
u'query': {u'actualQuery': u'43888060',
u'originalQuery': u'43888060',
u'suggestedQueries': []},
u'queryTime': 181,
u'results': [{u'department': {u'name': u'Home', u'storeDeptId': -1},
u'images': {u'largeUrl': u'http://i5.walmartimages.com/asr/7b8fd3b1-8eed-4b68-971b-81188ddb238c_1.a181800cade4db9d42659e72fa31469e.jpeg?odnHeight=180&odnWidth=180',
u'thumbnailUrl': u'http://i5.walmartimages.com/asr/7b8fd3b1-8eed-4b68-971b-81188ddb238c_1.a181800cade4db9d42659e72fa31469e.jpeg?odnHeight=180&odnWidth=180'},
u'inventory': {u'isRealTime': True,
u'quantity': 1,
u'status': u'In Stock'},
u'isWWWItem': True,
u'location': {u'aisle': [], u'detailed': []},
u'name': u'Dyson Ball Multi-Floor Bagless Upright Vacuum, 206900-01',
u'price': {u'currencyUnit': u'USD',
u'isRealTime': True,
u'priceInCents': 29900},
u'productId': {u'WWWItemId': u'43888060',
u'productId': u'2FY1C7B7RMM4',
u'upc': u'88560900430'},
u'ratings': {u'rating': u'4.721',
u'ratingUrl': u'http://i2.walmartimages.com/i/CustRating/4_7.gif'},
u'reviews': {u'reviewCount': u'1436'},
u'score': u'0.507073'}],
u'totalCount': 1}
, dass Sie alle Dict mit den Informationen, die Sie brauchen könnten, alles, was Sie tun, ist die params veröffentlichen und die Filialnummer, die Sie in der URL haben zu http://www.walmart.com/store/ajax/search
.
Um den Preis und Namen zu erhalten:
In [22]: import requests
In [23]: import json
In [24]: js = requests.post("http://www.walmart.com/store/ajax/search",
....: data={"searchQuery":"store=2516&size=18&dept=4044&query=43888060"}).json()
In [25]: data = json.loads(js['searchResults'])
In [26]: res = data["results"][0]
In [27]: print(res["name"])
Dyson Ball Multi-Floor Bagless Upright Vacuum, 206900-01
In [28]: print(res["price"])
{u'priceInCents': 29900, u'isRealTime': True, u'currencyUnit': u'USD'}
In [29]: print(res["price"]["priceInCents"])
29900
In [30]: print(res["price"]["priceInCents"])/100
299
Können Sie zeigen, was Sie versucht haben und welche Ergebnisse haben Sie? – alecxe
Die meisten Leute benutzen einen Parser wie die beliebte [Beautiful Soup] (https://www.crummy.com/software/BeautifulSoup/#Download). Sie finden viele Tutorials online oder Fragen zu [hier] (https://stackoverflow.com/search?q=beautiful+soup+findall). – patrick