2017-07-07 1 views
0

J'ai un problème où l'extraction de ce lienpage de chargement PhantomJS Python incorrect

http://www.bursamalaysia.com/market/listed-companies/company-announcements/#/?category=FA&sub_category=FA1&alphabetical=All&company=5250

me apporte des données de ce lien au lieu qui est la page principale elle-même. http://www.bursamalaysia.com/market/listed-companies/company-announcements/#/?category=all

Une idée pourquoi cela se produit-il? J'utilise du sélénium PhantomJS et de la belle soupe pour m'assister là-dedans.

# The standard library modules 
import os 
import sys 
import re 
import sqlite3 
import locale 
# The wget module 
import wget 
import time 
import calendar 
from datetime import datetime 
# The BeautifulSoup module 
from bs4 import BeautifulSoup 

# The selenium module 
from selenium import webdriver 
from selenium.webdriver.common.keys import Keys 
from selenium.webdriver.support.ui import WebDriverWait 
from selenium.webdriver.support import expected_conditions as EC 
from selenium.webdriver.common.by import By 


def getURLS(url): 
    driver = webdriver.PhantomJS(service_args=['--ignore-ssl-errors=true']) 
    driver.get(url) # load the web page 
    src = driver.page_source 
    #Get text and split it 
    soup = BeautifulSoup(src, 'html5lib') 

    print soup 

link ='http://www.bursamalaysia.com/market/listed-companies/company-announcements/#/?category=FA&sub_category=FA1&alphabetical=All&company=5250' 
getURLS(link) 

Solution de Alex Lucaci

def getURLS(url): 
    driver = webdriver.PhantomJS(service_args=['--ignore-ssl-errors=true']) 
    driver.get(url) # load the web page 
    src = driver.page_source 
    category_select = Select(driver.find_element_by_xpath('//*[@id="bm_announcement_types"]')) 
    category_select.select_by_visible_text("Financial Results") 
    category_select2 = Select(driver.find_element_by_xpath('//*[@id="bm_sub_announcement_types"]')) 
    category_select2.select_by_visible_text("Financial Results") 
    category_select3 = Select(driver.find_element_by_xpath('//*[@id="bm_company_list"]')) 
    category_select3.select_by_visible_text("7-ELEVEN MALAYSIA HOLDINGS BERHAD (5250)") 
    driver.find_element_by_xpath('//*[@id="bm_company_announcements_search_form"]/input[1]').click() 
    src = driver.page_source 
    soup = BeautifulSoup(src, 'html5lib') 
    link="http://www.bursamalaysia.com/market/listed-companies/company-announcements/#/?category=all" 
    getURLS(link) 

Répondre

1

Lorsque vous enregistrez la source la page n'est pas complètement chargé avec votre message soumis alors essayez d'attendre quelques secondes avant de récupérer la source de la page :

def getURLS(url): 
driver = webdriver.PhantomJS(service_args=['--ignore-ssl-errors=true']) 
driver.get(url) # load the web page 
time.sleep(5)# waiting for 5 seconds before fetching the source 
src = driver.page_source 
#Get text and split it 
soup = BeautifulSoup(src, 'html5lib') 

print soup 

Pour effectuer la liste déroulante vous sélectionnez avez importer la classe Select comme suit: from selenium.webdriver.support.ui import Select et vous devez sélectionner l'élément déroulant comme ça:

category_select = Select(driver.find_element_by_xpath('//*[@id="bm_announcement_types"]')) 
category_select.select_by_visible_text('Financial Results') 

Dans mon exemple, je l'ai fait pour le menu déroulant -Catégorie-, suivez les étapes exactes pour chaque catégorie. Notez que la sélection de la liste déroulante par xpath est le meilleur moyen et vous pouvez y parvenir en utilisant Google Chrome -> clic droit sur l'élément -> Inspecter-> faites un clic droit sur le <select> dans le menu de droite qui apparaît -> Copier -> Copier Xpath

Lorsque vous avez sélectionné tout l'élément, vous devez cliquer sur Soumettre et attendre quelques secondes avant de charger, après quoi vous récupérerez le code source. Faites-moi savoir si ma réponse vous a aidé.

+0

hey, désolé mate. Je l'ai testé et imprimé la soupe. il affiche toujours les données de la page principale au lieu des valeurs filtrées. Y at-il un moyen de le faire passer à travers c'est déroulant sélectionner des valeurs à la place? – Napmi

+0

J'ai modifié mon message initial. Regarde. –

+0

merci compagnon! abit de googling sur la façon de frapper soumettre et vos nouvelles connaissances sur moi pour find_element_by_xpath et cela fonctionne! Merci beaucoup! – Napmi