2017-12-31 123 views
0

Wie kann ich mit Seite befassen, die abgehört werden, so werden die Daten nicht korrekt ähnlich abgekratzt thisUmgang mit ungleichmäßigen Daten

Obwohl ich versucht, etwas Ähnliches unten ohne Glück zu implementieren, da die Seite nicht so einfach strukturiert ist. Irgendeine Idee, wie ich für ungleiche Daten sorgen kann, wie Daten zufällig aufgrund der Webseite ungleichmäßig werden.

Desired

Azam FC v Mwenge 1.8 https://www.bet365.com.au/#/AC/B1/C1/D13/E104/F16/S1/ 
Western Sydney Wanderers v Melbourne City 2.87 https://www.bet365.com.au/#/AC/B1/C1/D13/E101/F16/S1/ 
Sydney FC v Newcastle Jets 1.53 https://www.bet365.com.au/#/AC/B1/C1/D13/E101/F16/S1/ 

Ausgabe sieht wie folgt

Azam FC v Mwenge 1.8 https://www.bet365.com.au/#/AC/B1/C1/D13/E104/F16/S1/ 
Western Sydney Wanderers v Melbourne City 1.53 https://www.bet365.com.au/#/AC/B1/C1/D13/E101/F16/S1/ 

Die 1,53 sollte nicht für Western Sydney, sondern für Sydney FC

Script.py

import collections 
import csv 
import time 

from selenium import webdriver 
from selenium.common.exceptions import TimeoutException, NoSuchElementException 
from selenium.webdriver.common.by import By 
from selenium.webdriver.support import expected_conditions as EC 
from selenium.webdriver.support.ui import WebDriverWait 
from selenium.webdriver.support.ui import WebDriverWait as wait 

driver = webdriver.Chrome() 
driver.set_window_size(1024, 600) 
driver.maximize_window() 


driver.get('https://www.bet365.com.au/#/AS/B1/') 
driver.get('https://www.bet365.com.au/#/AS/B1/') 


def page_counter(): 
    for x in range(1000): 
     yield x 

count = page_counter() 

clickMe = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, ('//div[div/div/text()="Main Lists"]//div[starts-with(@class, "sm-CouponLink_Label") and normalize-space()]')))) 
coupon_lables = [x.text for x in driver.find_elements_by_xpath('//div[div/div/text()="Main Lists"]//div[starts-with(@class, "sm-CouponLink_Label") and normalize-space()]')] 

links = dict((next(count) + 1, e) for e in coupon_lables) 
desc_links = collections.OrderedDict(sorted(links.items(), reverse=True)) 
for key, label in desc_links.items(): 
    driver.get('https://www.bet365.com.au/#/AS/B1/') 
    clickMe = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, ('//div[div/div/text()="Main Lists"]//div[starts-with(@class, "sm-CouponLink_Label") and normalize-space()]')))) 
    driver.find_element_by_xpath(f'//div[contains(text(), "' + label + '")]').click() 

    groups = '/html/body/div[1]/div/div[2]/div[1]/div/div[2]/div[2]/div/div/div[2]/div' 
    xp_match_link = "//div//div[contains(@class, 'sl-CouponParticipantWithBookCloses_Name ')]" 
    xp_bp1 = "//div[contains(@class, 'gl-Market_HasLabels')]/following-sibling::div[contains(@class, 'gl-Market_PWidth-12-3333')][1]//div[contains(@class, 'gl-ParticipantOddsOnly')]" 

    try: 
     # wait for the data to populate the tables 
     wait(driver, 5).until(EC.element_to_be_clickable((By.XPATH, (xp_bp1)))) 
     time.sleep(2) 

     data = [] 
     for elem in driver.find_elements_by_xpath(groups): 
      try: 
       match_link = elem.find_element_by_xpath(xp_match_link) \ 
        .get_attribute('href') 
      except: 
       match_link = None 

      try: 
       bp1 = elem.find_element_by_xpath(xp_bp1).text 
      except: 
       bp1 = None 

      data.append([bp1, match_link]) 
      # data.append([match_link, bp1, ba1, bp3, ba3]) 
     print(data) 
     url1 = driver.current_url 

     with open('C:\\daw.csv', 'a', newline='', 
        encoding="utf-8") as outfile: 
      writer = csv.writer(outfile) 
      for row in data: 
       writer.writerow(row) 

    except TimeoutException as ex: 
     pass 
    except NoSuchElementException as ex: 
     print(ex) 
     break 

driver.close() 
+0

Könnten Sie die URL der Seite angeben, auf der diese unstrukturierten Daten vorhanden sind? –

+0

@VikasOjha Hier ist eine der Seiten, wo Sie sehen können, dass Daten nicht richtig geladen sind, was zu ungleichmäßigen Daten führt. https: //www.bet365.com.au#/AC/B1/C1/D13/E40/F443/S1. Es scheint, dass hin und wieder nicht auf jeder Last Pop –

+1

Nun, hier ist der Grund - die "Gruppen" xpath gibt 12 Knoten, während, "xp_match_link" gibt 7 Knoten. Sie müssen eine bessere Möglichkeit finden, diese XPaths zu schreiben, so dass sie konsistent werden. –

Antwort

0

Es sollte Arbeit wenn Sie ändern den folgenden xpath:

xp_match_link = "//div//div[contains(@class, 'sl-CouponParticipantWithBookCloses_NameContainer ')]" 
+1

Die Gruppen xpath ist auch nicht ganz richtig. –

+0

Die Gruppen xpath scheint vollkommen richtig zu sein, da es zwei separate Tabellen auf der Seite –

+0

erfasst Ich bekomme [1.80, None]. Dies wird durch Gruppen xpath verursacht. Ich könnte das komplett entfernen und die Daten normal abkratzen, aber wenn eine Taste wegen eines Fehlers entfernt wird, der ziemlich oft passiert, bekomme ich ungleiche Daten. –