我如何分割刮取的数据,并将其保存在单独的列中,作为带有完整链接和描述的csv?

2024-10-02 20:34:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在一个网页刮板工作,这是返回链接和职位说明,如果它匹配的关键字列表。我的问题是,正在导出的csv只是一个长句,链接和描述放在一行。在

如何有效地将描述和链接分成两个单独的列?我如何添加链接的剩余部分以便能够单击csv中的链接?还有没有一种方法可以避免csv中的重复条目?在

这是我的代码:

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.")

Tags: csvinimportbrowserfor链接findtr
3条回答

由于该网站使用Ajax和JavaScript库来填充页面上的表,所以获取所需数据的最简单方法是复制Ajax请求。在

来自服务器的JSON数据具有以下结构:

{
    "value": {
        "draw": "-1",
        "recordsTotal": 1476,
        "recordsFiltered": 1476,
        "data": [{
            "DT_RowClass": "even",
            "0": "<a href=\"/at.gv.bmdw.eproc-p/public/de_AT/tenderlist?action=view&amp;object=41a809d9-0b61-4991-86b8-74dc07973af3-15ed14df-d91c-4905-94fd-e1d7935eaef1\">Planung Freiland/Brücke</a>",
            "1": "Autobahnen- und Schnellstraßen-Finanzierungs-Aktiengesellschaft",
            "2": "08.04.2019",
            "3": null
        }, {
            "DT_RowClass": "odd",
            "0": "<a href=\"/at.gv.bmdw.eproc-p/public/de_AT/tenderlist?action=view&amp;object=86dd87bd-7426-40c5-946b-62b2af638aab-7a54478b-9e89-4d47-bdf8-dc8b867c57b8\">Lieferung von Erdgas 2020 - 2022</a>",
            "1": "Republik Österreich (Bund), Bundesbeschaffung GmbH sowie alle weiteren Auftraggeber gemäß der den Ausschreibungsunterlagen beiliegenden Drittkundenliste, im Vergabeverfahren alle vertreten durch die Bundesbeschaffung GmbH",
            "2": "08.04.2019",
            "3": "07.05.2019"
        }]
    }
}

下面使用requests模块从服务器获取JSON,并使用最小的HTML解析器从链接中提取文本。你可以自由使用beauthoulsoup来达到同样的目的。在

^{pr2}$

用法:

for item in get_ausschreibungen(0, 3):
    print(item)

为我打印这个:

{'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}

我确信过滤/转换成CSV不再是个问题了。在

使用浏览器的开发人员工具(F12)来确定正在发送的其他请求参数以及它们是否与您相关。您还可以尝试使用requests模块的会话功能“混合”,复制所有的HTTP头和cookies,但是考虑到这似乎是一个政府网站,他们可能不会介意您正在删除它们。在

分栏写

reader = csv.DictReader(f) # open and write mode opened file
csvWriter = csv.writer(f)
existing_queries = set()
for row in reader:
    if reader.line_num == 1:
       continue
if row['link'] in existing_queries:
    print("Already exists")
else:
    csvWriter.writerow("description", "link") # will write
    existing_queries.add("description", "link")


我希望这有帮助

使用的换行符和分隔符参数csv.writer班级

您可以在这里找到示例:https://docs.python.org/3/library/csv.html#writer-objects

相关问题 更多 >