0
votes

Comment puis-je diviser les données raclées et l'enregistrer dans des colonnes séparées sous forme de CSV avec un lien complet et une description?

Je travaille sur un grattoir Web qui retourne les liens et des descriptions des offres d'emploi s'il correspond à la liste des mots-clés. La question que j'ai est que les CSV qui étant exportés ne soient qu'une phrase longue où le lien et la description vont dans une ligne.

Comment puis-je effectivement diviser la description et les liens en deux colonnes distinctes? Et comment puis-je ajouter le reste du lien afin de pouvoir cliquer sur le lien à l'intérieur du CSV? Il existe également une façon d'éviter les entrées en double dans le CSV? P>

Voici mon code: p>

from selenium import webdriver
import time, re, csv
from bs4 import BeautifulSoup as BS

keywords = ["KI", "AI", "Big Data", "Data", "data", "big data", 
"Analytics", "analytics", "digitalisierung", "ML",
"Machine Learning", "Daten", "Datenexperte", 
"Datensicherheitsexperte", "Analytikleistungen"]

browser = webdriver.Chrome()

url = "https://ausschreibungen.usp.gv.at/at.gv.bmdw.eproc-p/public"

browser.implicitly_wait(30)

browser.get(url)


innerHTML = browser.execute_script("return 
document.body.innerHTML")

soup = BS(browser.page_source, 'html.parser')

# browser.quit()
# print(soup.text)
tenders = soup.find('table', {'id': 'tenderlist'})
tbody = tenders.find('tbody')

browser.quit()


ausschreiben_found = []

for tr in tbody.find_all('tr'):
    ausschreiben = tr.find_all('td')
for keyword in keywords:
    for word in ausschreiben:
        if keyword in str(word):
            ausschreiben_found.append(word)
            print(ausschreiben_found)
with open("ausschreiben.csv", 'a', encoding='utf-8') as toWrite:
    fieldnames = ["Beschreibung", "Links"]
    writer = csv.writer(toWrite)
    writer.writerows(ausschreiben_found)
    # subprocess.call('./Autopilot3.py')
    print("Matched Ausschreiben have been collected.")


5 commentaires

Lorsque j'exécute votre code, il produit une liste vide pour Ausschreiben_found (ou je devrais dire que rien n'est annexé).


J'aimerais aussi ajouter que vous pouvez accéder à la table via le XHR trouvé lorsque vous inspectez la page.


Si rien n'est annexé, cela ne signifie-t-il pas qu'il n'y avait pas de matchs? L'autre jour, il a renvoyé 2 annonces, ou je me trompe? Pourriez-vous élaborer sur xhr?


Lorsque vous regardez les demandes Ajax, cette page envoie, il existe un qui remplit la table de données ( ... / at.gv.bmdww.eproc-p / ajax / datatablestenderlist? ... ). Il retourne JSON. Vous aurez peut-être un moment beaucoup plus facile de demander cela directement que d'aller bien au sélénium et d'essayer d'analyser le HTML.


Erik, vous avez raison, que si rien n'a été ajouté, cela signifie que rien n'a été trouvé avec ces mots-clés. J'anticipisais depuis que vous l'avez posté aujourd'hui, vous receviez des résultats aujourd'hui.


3 Réponses :


-1
votes

Utilisez les paramètres Newline et Délimiteur de la classe CSV.Writer

Vous pouvez trouver des exemples ici: https: //docs.python .org / 3 / bibliothèque / csv.html # écrivain-objets


1 commentaires

Bien que cela puisse aider à op, il vaut mieux ajouter plus de détails, des exemples, etc. s'il vous plaît fournir des réponses qui n'exigent pas de clarification de l'Asker.



0
votes

écrire dans des colonnes séparées xxx

J'espère que cela aide


0 commentaires

2
votes

Étant donné que le site Web utilise AJAX et une bibliothèque JavaScript pour remplir la table de la page, le moyen le plus simple de saisir les données souhaitées de reproduire la demande AJAX.

Les données JSON du serveur ont cette structure: P>

{'Bezeichnung': 'Planung Freiland/Brücke', 'Organisation': 'Autobahnen- und Schnellstraßen-Finanzierungs-Aktiengesellschaft', 'Veröffentlicht': '08.04.2019', 'Frist': None}
{'Bezeichnung': 'Lieferung von Erdgas 2020 - 2022', 'Organisation': 'Republik Österreich (Bund), Bundesbeschaffung GmbH sowie alle weiteren Auftraggeber gemäß der den Ausschreibungsunterlagen beiliegenden Drittkundenliste, im Vergabeverfahren alle vertreten durch die Bundesbeschaffung GmbH', 'Veröffentlicht': '08.04.2019', 'Frist': '07.05.2019'}
{'Bezeichnung': 'Umbau Bahnhof Villach ', 'Organisation': 'ÖBB-Personenverkehr AG', 'Veröffentlicht': '08.04.2019', 'Frist': None}


4 commentaires

Merci beaucoup pour cela! N'a pas réalisé que je pourrais utiliser la demande Ajax pour analyser les données de :)


Y a-t-il un moyen d'analyser le lien HREF aussi?


Comme je l'ai dit, vous pouvez utiliser belleSoup pour analyser la chaîne à rangée ['0'] . Puisqu'il pourrait y avoir plus complexe HTML dans la première colonne que juste un singulier , c'est une bonne idée de toute façon.


Il existe également un moyen d'étendre mon "parseur HTML littlelest" pour cela, si vous avez envie de défi, vous pouvez essayer de le faire (lisez sur Le html.parser module , indice: Vous devez écrire un manipul_starttag méthode). La récompense serait que c'est probablement un peu plus rapide que le beau-ensemble plus lourd et que vous apprenez à travailler avec des analyseurs à base d'événements. :)