2016-06-04 16 views
-1

Ich möchte eine Webseite zu kratzen und ich muss finden, wenn der Stil des Elements ist Anzeige: keine; oder Anzeige: Block wie der folgende Code. (Wenn ich die Quelle der Webseite sehe ich nicht in diesem Stil sehen. Ich weiß es, weil ich das Element Überprüfen Sie verwenden, um von Chrome)Python Scrape Stil Anzeige: keine

<p id="add_to_cart" class="buttons_bottom_block no-print" style="display: none;"> 
           <button type="submit" name="Submit" class="exclusive"> 
            <span>¡Cómprame!</span> 
           </button> 
          </p> 


          <p id="add_to_cart" class="buttons_bottom_block no-print" style="display: block;"> 
           <button type="submit" name="Submit" class="exclusive"> 
            <span>¡Cómprame!</span> 
           </button> 
          </p> 

Es geht um ein Prestashop Shop Online Schauen Sie bitte auf den folgenden Video https://youtu.be/wlngNaNw1Ao und Sie werden sehen, die div oosHook ändern Sie die Stil Anzeige: Block oder Anzeige: keine, aber Sie können dies auf den Quellcode sehen. Bitte überprüfen Sie den Link https://www.esenciadeperfume.com/bvlgari/bvlgari-man-in-black-edp.html#/6-formato-100_ml_tester

und wählen Sie ein und anderes Produkt, Sie sehen die Änderungen, aber wenn Sie den Quellcode analysieren, sieht es auf allen Entscheidungen gleich. Ich schrieb den folgenden Python-Code für Test und die Änderungen nicht erkennen kann:

import urllib.request 
import re 
import pymysql 
from bs4 import BeautifulSoup 

#link1='https://www.esenciadeperfume.com/bvlgari/bvlgari-man-in-black-edp.html#/6-formato-100_ml_tester' 
link1='my reputation doesn't allow' 
req = urllib.request.Request(link1, headers={'User-Agent': 'Mozilla/5.0'})   
htmltext = urllib.request.urlopen(req).read() 
if htmltext is None: 
    print('erro')    
else: 
    matches=re.findall('<div id="oosHook" style="display: block;">',str(htmltext))   
    if len(matches)==0: 
     print('Not found') 
    else: 
     print('Found') 

Ok es mit dem folgenden Code scheint, ich

import urllib.request 
import re 
import pymysql 
from bs4 import BeautifulSoup 
from selenium import webdriver 
link1='https://www.esenciadeperfume.com/bvlgari/bvlgari-man-in-black-edp.html#/6-formato-100_ml_tester' 
#link1='https://www.esenciadeperfume.com/bvlgari/bvlgari-man-in-black-edp.html#/20-formato-60_ml' 
browser = webdriver.Firefox() # Your browser will open, Python might ask for permission 
browser.get(link1)    # This might take a while 
soup = BeautifulSoup(browser.page_source,'html.parser') 
cart_style = soup.find('p', id='add_to_cart').get('style') 
oos_style = soup.find('div', id='oosHook').get('style') 
print('Oos_style-> '+oos_style) 

Das Problem der Arbeit erledigen kann: Der Prozess es zu langsam

+0

Was genau versuchen Sie zu kratzen? –

Antwort

1

Ich nehme an, Sie wissen, wie Sie eine Anfrage stellen und die Seitenquelle in Python erhalten.

Wenn Sie mit BeautifulSoup arbeiten, können Sie nach den Elementen suchen und die Tags und Attribute von dort abrufen. Sie könnte so etwas wie:

from bs4 import BeautifulSoup as bs 

soup = bs(souce_code) 
elements = soup.find_all('p') 

for e in elements: 
    style = e.get('style').split(';') # Here I'm account for multiple entries in the style 
    for s in style: 
     if 'display' in s: 
      print s.split(':')[1] # Prints 'none', 'block' or any other display style. 


Sie auch mit den Stilen auf verschiedene Weise arbeiten, konnte ich dies für Verständlichkeit halten beschlossen, aber man konnte einen direkteren Ansatz haben oder re verwenden, um Behandle es direkt.


EDIT

Ok, Sie versuchen, eine dynamische Webseite verschrotten, das ist ein bisschen anders. Sie müssen eine Sitzung erstellen und warten, bis der Server alle erforderlichen Änderungen vorgenommen hat.

Ich habe hier versucht und erfolgreich eine Seite mit dem selenium Paket bekommen. Anstatt eine einfache Anfrage zu verwenden, versuchen Sie Folgendes:

from selenium import webdriver 

"""There are actually several options here, 
    choose the one you like most 
    (you need the browser to be installed in your pc)""" 
browser = webdriver.Firefox() # Your browser will open, Python might ask for permission 
browser.get(url)    # This might take a while 

# And than you can keep working from here 
cart_style = browser.find_element_by_id('add_to_cart').get_attribute('style') 
oos_style = browser.find_element_by_id('oosHook').get_attribute('style') 


Wie @PadraicCunningham vorgeschlagen, können Sie den PhantomJS Treiber für schnellere Ergebnisse können, rufen Sie einfach:

browser = webdriver.PhantomJS(path_to_phantom) 

Hinweis: Wenn sich PhantomJS nicht in Ihrem $ PATH befindet, müssen Sie angeben, wo es sich befindet.

+0

Bitte lesen Sie meine aktualisierte Frage – mariolopes

+0

Antwort aktualisiert, möchten Sie vielleicht auch andere Pakete für komplexe Scraping hier überprüfen: http://softwarerecs.stackexchange.com/questions/20082/python-library-for-complex-web-scraping – pekapa

+0

Vielen Dank Sie, leider ist der Prozess langsam aber es funktioniert. Wenn du einen anderen Weg findest (am schnellsten) lass es mich wissen – mariolopes