Comment puis-je gratter cette page Web https: //www.bseindia.com/stock-share-price/asian-paints-ltd/asianpaint/500820/ et avez spécifiquement besoin du chiffre de ROE mentionné dans le tableau?
J'ai utilisé le code suivant dans Exceller. Je ne sais pas grand-chose sur Google Sheets Scraping
Sub FetchData() With ActiveSheet.QueryTables.Add(Connection:= _ "URL;https://www.bseindia.com/stock-share-price/asian-paints-ltd/asianpaint/500820/", Destination:=Range( _ "$A$1")) .Name = "www" .FieldNames = True .RowNumbers = False .FillAdjacentFormulas = False .PreserveFormatting = True .RefreshOnFileOpen = False .BackgroundQuery = True .RefreshStyle = xlInsertDeleteCells .SavePassword = False .SaveData = True .AdjustColumnWidth = True .RefreshPeriod = 0 .WebSelectionType = xlEntirePage .WebFormatting = xlWebFormattingNone .WebPreFormattedTextToColumns = True .WebConsecutiveDelimitersAsOne = True .WebSingleBlockTextImport = False .WebDisableDateRecognition = False .WebDisableRedirections = False .Refresh BackgroundQuery:=False End With End Sub
Je n'ai pas pu récupérer les données correctement.
Des suggestions / de l'aide à ce sujet? Besoin du ROE, le reste n'est pas obligatoire.
3 Réponses :
Voici la façon dont je trouve plus facile d'obtenir cette valeur particulière. Une fois que la boucle for
détecte ROE
, elle ira après la valeur requise et quittera la boucle car ils sont tous les deux dans le même nœud parent.
Microsoft Html Object Library Microsoft Internet Controls
Références à ajouter:
Sub FetchData() Dim IE As New InternetExplorer, post As Object Dim Html As HTMLDocument, elem As Object With IE .Visible = False .navigate "https://www.bseindia.com/stock-share-price/asian-paints-ltd/asianpaint/500820/" While .Busy Or .readyState < 4: DoEvents: Wend Set Html = .document End With For Each post In Html.getElementsByTagName("td") If post.innerText = "ROE" Then Set elem = post.ParentNode.querySelector(".textvalue") Exit For End If Next post [A1] = elem.innerText End Sub
J'ai peur de savoir comment ajouter deux de ces références?
Consultez ce lien pour en savoir plus.
Merci beaucoup! Je vais approfondir cela. Encore merci
Fait! Encore une fois merci beaucoup. Simplifie beaucoup pour moi.
SIM ~ cela me donne une erreur d'exécution '91': variable d'objet ou avec variable de bloc non définie
J'ai essayé plusieurs fois mais je n'ai pas pu reproduire l'erreur. Cependant, tout dépend de votre vitesse Internet, car il faut parfois un peu plus de temps pour que l'élément se charge correctement. Dans de tels cas, un peu d'attente aide. Essayez d'utiliser cette ligne Application.Wait Now + TimeValue ("00:00:05")
entre End With
et For Each post
dans ce qui précède scénario.
Il fonctionne maintenant. J'y ai également ajouté plusieurs liens d'entreprise.
Malheureusement, cela ne sera pas possible car le site est contrôlé par JavaScript et Google Sheets ne peut pas comprendre / importer JS. vous pouvez tester cela simplement en désactivant JS pour un lien donné et vous verrez une page vierge:
tout ce que vous pouvez obtenir est ce que vous voyez: p>
=ARRAY_CONSTRAIN(IMPORTDATA("https://www.bseindia.com/stock-share-price/asian-paints-ltd/asianpaint/500820/"), 5000, 15)
La saisie manuelle des données fonctionne, je suppose, à la fin de la journée, lorsque l'automatisation n'aide pas. Bien que j'ai remarqué qu'ils ont changé les fonctionnalités du site. Il m'arrive de gratter le Web d'autres choses sur le site assez facilement, mais cela semblait difficile à craquer. Ce que vous avez mentionné explique tout. Merci
Utilisez l'API que la page utilise beaucoup plus rapidement. Vous pouvez utiliser powerquery pour gérer la réponse json, un analyseur json ou simplement utiliser split. Placez le code dans un module standard et créez un lien vers un bouton si vous souhaitez actualiser en appuyant sur un bouton.
Option Explicit Public Sub GetInfo() Dim s As String, ids(), i As Long ids = Array(500820, 500312, 500325, 532540) With CreateObject("MSXML2.XMLHTTP") For i = LBound(ids) To UBound(ids) .Open "GET", "https://api.bseindia.com/BseIndiaAPI/api/ComHeader/w?quotetype=EQ&scripcode=" & ids(i) & "&seriesid=", False .send s = .responseText ActiveSheet.Cells(i + 1, 1) = Split(Split(s, """ROE"":""")(1), Chr$(34))(0) Next End With End Sub
Merci, cela fonctionne bien et que diriez-vous si je souhaite utiliser plusieurs données d'entreprise? Comment dois-je procéder?
Vous utiliseriez une boucle. Quelles sont les différentes entreprises? Vous devez concaténer l'ID approprié dans l'appel de l'API.
Pour être honnête, je ne suis pas très fan de VBA. Comme je l'ai mentionné plus tôt, des choses simples sont faisables par moi. Mais pas beaucoup de détails, je peux entrer dans cette chose
Par exemple 500312, 500325, 532540
bseindia.com/stock-share-price / tata-consultancy-services-ltd /…
bseindia.com/stock -partage-prix /…
bseindia.com/stock-share-price/reliance -industries-ltd / relia nce /…
Bien compris maintenant. Merci!
J'ai joué avec le code car celui-ci fonctionnait bien. Comme j'y ai ajouté d'autres variables qui ont été affichées dans cette boîte. Mais je suis coincé avec d'autres variables, à savoir le tableau des résultats et du modèle d'actionnariat. Cela a-t-il à voir avec le lien API ou autre chose? Je ne sais pas comment procéder à partir d'ici.
Veuillez poster une nouvelle question, ajoutez votre code actuel et envoyez-moi le lien ici.
Il manque deux balises principales
excel
etvba
.La question est trop large car elle concerne apparemment des fonctionnalités qui fonctionnent très différemment sur deux applications de feuille de calcul.