0
votes

Web gratter en utilisant une belle soupe - Comment puis-je obtenir toutes les catégories

Comment puis-je obtenir toutes les catégories mentionnées sur chaque page d'annonce du même site Web " https: //www.sfma.org.sg/member/category ". Par exemple, lorsque je choisis la catégorie de boissons alcoolisées sur la page mentionnée ci-dessus, les annonces mentionnées sur cette page ont la catégorie des informations telles que ceci: - xxx pré>

Comment puis-je extraire les catégories mentionnées ici avec même variable. p>

Le code que j'ai écrit pour cela est: - p> xxx pré>

mais il produit la sortie ci-dessous qui sont tous les liens de la page et pas le texte avec dans le HREF: - p>

['http://www.sfma.org.sg/about/singapore-food-manufacturers-association',
 'http://www.sfma.org.sg/about/council-members',
 'http://www.sfma.org.sg/about/history-and-milestones',
 'http://www.sfma.org.sg/membership/',
 'http://www.sfma.org.sg/member/',
 'http://www.sfma.org.sg/member/alphabet/',
 'http://www.sfma.org.sg/member/category/',
 'http://www.sfma.org.sg/resources/sme-portal',
 'http://www.sfma.org.sg/resources/setting-up-food-establishments-in-singapore',
 'http://www.sfma.org.sg/resources/import-export-requirements-and-procedures',
 'http://www.sfma.org.sg/resources/labelling-guidelines',
 'http://www.sfma.org.sg/resources/wsq-continuing-education-modular-programmes',
 'http://www.sfma.org.sg/resources/holistic-industry-productivity-scorecard',
 'http://www.sfma.org.sg/resources/p-max',
 'http://www.sfma.org.sg/event/',
  .....]


0 commentaires

4 Réponses :


0
votes

Les liens que vous recherchez sont évidemment peuplés par un script (recherchez la réponse de https://www.sfma.org.sg/member/category/Manufacturier dans chrome-> inspect-> réseau). Si vous regardez la page, vous verrez le script le charger. Au lieu de racler des liens, grattez des scripts, vous aurez la liste. Puisque le format de lien est connu, plugin les valeurs de JSON. Et voilà! Voici le code de démarreur avec lequel travailler. Vous pouvez déduire le reste.

import requests 
from bs4 import BeautifulSoup

page = "https://www.sfma.org.sg/member/category/manufacturer"
information = requests.get(page)
soup = BeautifulSoup(information.content, 'html.parser')
links = [soup.find_all('script')]


0 commentaires

1
votes

Vous devez obtenir les valeurs Permalink à partir du script à l'aide de Regex et rejoindre l'URL de base. Voici l'échantillon

import re
from bs4 import BeautifulSoup
from urllib.parse import urljoin

base = 'https://www.sfma.org.sg/member/category/manufacturer'

script_txt = """<script>
        var tmObject = {'tmember':[{id:'1',begin_with:'0-9',name:'1A Catering Pte Ltd',category:'22,99',mem_type:'1',permalink:'1a-catering-pte-ltd'},{id:'330',begin_with:'A',name:'A-Linkz Marketing Pte Ltd',category:'3,4,10,14,104,28,40,43,45,49,51,52,63,66,73,83,95,96',mem_type:'1',permalink:'a-linkz-marketing-pte-ltd'},{id:'318',begin_with:'A',name:'Aalst Chocolate Pte Ltd',category:'30,82,83,84,95,97',mem_type:'1',permalink:'aalst-chocolate-pte-ltd'},{id:'421',begin_with:'A',name:'ABB Pte Ltd',category:'86,127,90,92,97,100',mem_type:'3',permalink:'abb-pte-ltd'},{id:'2',begin_with:'A',name:'Ace Synergy International Pte Ltd',category:'104,27,31,59,83,86,95',mem_type:'1',permalink:'ace-synergy-international-pte-ltd'}
        </script>"""

soup = BeautifulSoup(script_txt)

txt = soup.script.get_text()
pattern = re.compile(r'permalink:\'(.*?)\'}')

permlinks = re.findall(pattern, txt)
for i in permlinks:
    href = "../info/{{permalink}}"
    href = href.split('{')[0]+i
    print(urljoin(base, href))  

https://www.sfma.org.sg/member/info/1a-catering-pte-ltd
https://www.sfma.org.sg/member/info/a-linkz-marketing-pte-ltd
https://www.sfma.org.sg/member/info/aalst-chocolate-pte-ltd
https://www.sfma.org.sg/member/info/abb-pte-ltd
https://www.sfma.org.sg/member/info/ace-synergy-international-pte-ltd


2 commentaires

Je suis en fait nouveau à Python, alors pardonnez-moi si cela semble être une question muette, la variable script_txt ne contient que le script partiel, et non pour toutes les annonces de la page, comment puis-je obtenir un script entier afin que je puisse obtenir toutes les URL , Merci pour l'aide!


Vous devez extraire le contenu du script des données rampées. Vous avez tout votre contenu dans la variable soupe . Vous pouvez utiliser Soupe.script.get_text () pour récupérer le texte du script



2
votes

Si vous voulez simplement les liens des résultats que vous avez déjà postés, vous pouvez obtenir cela comme suit: xxx pré>

sortie: p>

https://www.sfma.org.sg/member/info/1a-catering-pte-ltd
https://www.sfma.org.sg/member/info/a-linkz-marketing-pte-ltd
https://www.sfma.org.sg/member/info/aalst-chocolate-pte-ltd
https://www.sfma.org.sg/member/info/abb-pte-ltd
https://www.sfma.org.sg/member/info/ace-synergy-international-pte-ltd
https://www.sfma.org.sg/member/info/acez-instruments-pte-ltd
https://www.sfma.org.sg/member/info/acorn-investments-holding-pte-ltd
https://www.sfma.org.sg/member/info/ad-wright-communications-pte-ltd
https://www.sfma.org.sg/member/info/added-international-s-pte-ltd
https://www.sfma.org.sg/member/info/advance-carton-pte-ltd
https://www.sfma.org.sg/member/info/agroegg-pte-ltd
https://www.sfma.org.sg/member/info/airverclean-pte-ltd
...


1 commentaires

Merci beaucoup !! Cela m'a beaucoup aidé !!



1
votes

Pour obtenir le nombre total correct de 240 pour le fabricant (et obtenir le nombre total de toutes catégories ou d'une catégorie de catégorie donnée):

Si vous voulez que les listes de fabricants ont d'abord consulter la page et vérifier Combien de liens il devrait y avoir:

 Entrez la description de l'image ici

En assurant que le sélecteur CSS a la classe du parent ul Ie .w3-ul Nous limitons uniquement les liens appropriés lorsque nous ajoutons dans le sélecteur de classe enfant de .plink. Donc, nous avons 240 sur la page.


Si nous utilisons simplement cela sur le HTML renvoyé à partir de Demandes Nous trouverions nous sommes loin de cela, car de nombreux liens sont ajoutés de manière dynamique et ne sont donc pas présents avec demandes où JavaScript ne fonctionne pas.

Cependant, tous les liens (pour toutes les sélections de liste déroulante - non seulement La fabrication) est présente dans un dictionnaire JavaScript, dans une balise , que nous pouvons voir le début de ci-dessous:

 Entrez la description de l'image ici < / p>


Nous pouvons réégionner cet objet à l'aide de l'expression suivante: xxx

 Entrez la description de l'image ici


Maintenant, lorsque nous inspections la chaîne retournée, nous pouvons voir que nous avons des clés non cotées qui peuvent poser sa pose MS Si nous souhaitons lire ce dictionnaire avec une bibliothèque JSON:

< img src = "https://i.stack.imgur.com/astdwa.png" alt = "Entrez la description de l'image ici">

Nous pouvons utiliser le hjson Bibliothèque d'analyse, car cela permettra aux touches non cotées. * PIP INSTALLER HJSON


Enfin, nous savons que nous avons toutes les annonces et non seulement fabricants; Inspection des balises dans le HTML d'origine Nous pouvons déterminer que la balise est associée au code de groupe 97 .

 Entrez la description de l'image ici


Donc, j'extrise à la fois les liens et les groupes de l'objet JSON comme une liste de tuples. J'ai divisé les groupes sur le "," afin que je puisse utiliser dans filtrer pour le code de fabrication approprié: xxx

Vérification du dernier len de la Liste Nous pouvons obtenir notre cible 240 .

donc, nous avons all_results (toutes les catégories), un moyen de diviser par catégorie, ainsi qu'un exemple fonctionné pour fabricant


xxx

2 commentaires

Merci beaucoup pour une telle explication détaillée !! Oui, cela donne le bon numéro,


Je pense que je suis devenu fan de ce hjson .