2016-06-26 5 views
0

Ich versuche, Python und Regex zu verwenden, um den Preis in der Beispielwebsite unten zu ziehen, aber bekomme keine Ergebnisse.Verwenden Sie Regex oder etwas anderes, um Website-Daten zu erfassen

Wie kann ich den Preis am besten erfassen (ich interessiere mich nicht für die Cents, nur die Dollarbeträge)?

http://www.walmart.com/store/2516/search?dept=4044&dept_name=Home&query=43888060

Relevante HTML:

<div class="price-display csTile-price"> 
     <span class="sup">$</span> 
     299 
     <span class="currency-delimiter">.</span> 
     <span class="sup">00</span> 
</div> 

Was wäre der regex sein, die "299" zu erfassen oder der ein einfacherer Weg, dies zu bekommen? Vielen Dank!

+0

Können Sie zeigen, was Sie versucht haben und welche Ergebnisse haben Sie? – alecxe

+0

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

Antwort

0

Mit regexp kann es ein bisschen schwierig sein, wie genau Ihr Muster sein sollte. Ich tippte schnell etwas zusammen: https://regex101.com/r/lF5vF2/1

Sie sollten die Idee bekommen und diese an Ihre tatsächlichen Bedürfnisse anpassen.

Mit freundlichen Grüßen

0

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 
+0

Wow - Du bist schnell !! Ich werde etwas Zeit brauchen, um zu verdauen. Im Moment habe ich das, was den Preis noch nicht ergreift.Scheint so, als ob ich mit bs4 basteln sollte ... –

+0

@MiaEella, urllopen gibt dir nicht die Quelle, die du brauchst, rechtsklicke in deinen Browser und wähle Quelltext aus, du wirst den HTML-Code in deiner Frage nirgends finden. Es wird über Javascript geladen. Sie müssen entweder Selen verwenden, das mit JavaScript umgehen kann oder was ich mit Anfragen gemacht habe. Ich würde die Anforderungslogik verwenden –

+0

Ich replizierte Ihre json-Ausgabe, aber verlor in, wie man den Teil nachher implementiert, um "den Preis und den Namen zu erhalten:". Mein anderes Ziel ist es, eine Liste von Geschäft # # durchlaufen und Ergebnisse nach Geschäft # ausgeben. Irgendwelche Ideen da? Ich lerne eindeutig noch, entschuldige mich also für meine langsame Aufnahme. –

-1

Ok, nur die Suche für Numerik (I hinzugefügt $ und.) Und Concat die Ergebnisse in einen String (I verwendet "" .join()).

>>> txt = """ 
     <div class="price-display csTile-price"> 
      <span class="sup">$</span> 
      299 
      <span class="currency-delimiter">.</span> 
      <span class="sup">00</span> 
     </div> 
     """ 


>>> ''.join(re.findall('[0-9$.]',txt.replace("\n",""))) 
'$299.00' 
Verwandte Themen