正在 python 中的 mysql 数据库中准备抓取的文本

Preparing scraped text to mysql database in python

我 运行 遇到了为数据库准备数据的问题,因为我是第一次这样做
我从 html dtdd 标签中抓取了文本,所以我得到了很多我需要但我不需要的信息.

我的输出是这样的:

{'Plotas:': '49,16 m²', 'Kambarių sk.:': '2', 'Aukštas:': '2', 'Aukštų sk.:': '7', 'Metai:': '2022', 'Pastato tipas:': 'Mūrinis', 'Šildymas:': 'Centrinis kolektorinis', 'Įrengimas:': 'Dalinė apdaila                                                                            NAUDINGA:\nInterjero dizaineriai', 'Pastato energijos suvartojimo klasė:': 'A+', 'Reklama/pasiūlymas:': 'Pasirinkite geriausią internetą namams', 'Ypatybės:': 'Nauja kanalizacija\nNauja elektros instaliacija', 'Papildomos patalpos:': 'Sandėliukas\nVieta automobiliui', 'Apsauga:': 'Šarvuotos durys\nKodinė laiptinės spyna\nVaizdo kameros'}

我的代码是这样的:

import pandas as pd
from selenium import webdriver
from bs4 import BeautifulSoup
import re
import time
import csv

PATH = 'C:\Program Files (x86)\chromedriver.exe'
driver = webdriver.Chrome(PATH)


for puslapis in range(2, 3):
    driver.get(f'https://www.aruodas.lt/butai/vilniuje/puslapis/{puslapis}')
    response = driver.page_source
    soup = BeautifulSoup(response, 'html.parser')
    blocks = soup.find_all('tr', class_= 'list-row')

    stored_urls = []

    for url in blocks:
        try:
            stored_urls.append(url.a['href'])
        except:
            pass

    for link in stored_urls:
        driver.get(link)
        response = driver.page_source
        soup = BeautifulSoup(response, 'html.parser')

        try:
            #Reikia su RegEx sutvarkyti adresa
            adress = soup.find('h1','obj-header-text').text.strip()
            # print(adress)
        except:
            adress = 'n/a'

            def get_dl(soup):
                keys, values = [], []
                for dl in soup.findAll("dl", {"class": "obj-details"}):
                    for dt in dl.findAll("dt"):
                        keys.append(dt.text.strip())
                    for dd in dl.findAll("dd"):
                        values.append(dd.text.strip())
                return dict(zip(keys, values))


            dl_dict = get_dl(soup)

问题:我如何过滤和准备我需要的数据..例如,我想要的输出应该是这样的:

Plotas: 49,16 m²
Kambariu_sk: 2
Metai: 2022

我应该如何将这些信息放入数据库以便更容易地传输到数据库中?

我建议您改进循环以同时查找 dtdd 条目。然后仅添加所需列表中的键。

尝试以下方法:

from selenium import webdriver
from bs4 import BeautifulSoup


def get_dl(soup):
    d = {}
    
    for dl in soup.findAll("dl", {"class": "obj-details"}):
        for el in dl.find_all(["dt", "dd"]):
            if el.name == 'dt':
                key = el.get_text(strip=True)
            elif key in ['Plotas:', 'Kambarių sk.:', 'Metai:']:
                d[key] = el.get_text(strip=True)
        
    return d


PATH = 'C:\Program Files (x86)\chromedriver.exe'
driver = webdriver.Chrome(PATH)
data = []

for puslapis in range(2, 3):
    driver.get(f'https://www.aruodas.lt/butai/vilniuje/puslapis/{puslapis}')
    response = driver.page_source
    soup = BeautifulSoup(response, 'html.parser')
    blocks = soup.find_all('tr', class_= 'list-row')
    stored_urls = []

    for url in blocks:
        try:
            stored_urls.append(url.a['href'])
        except:
            pass

    for link in stored_urls:
        driver.get(link)
        response = driver.page_source
        soup = BeautifulSoup(response, 'html.parser')
        h1 = soup.find('h1', 'obj-header-text')
        
        if h1:
            address = h1.get_text(strip=True)
        else:
            address = 'n/a'

        data.append({'Address' : address, **get_dl(soup)})
            
for entry in data:
    print(entry)

给你data首发:

{'Address': 'Vilnius, Markučiai, Pakraščio g., 2 kambarių butas', 'Plotas:': '44,9 m²', 'Kambarių sk.:': '2', 'Metai:': '2023'}
{'Address': 'Vilnius, Pašilaičiai, Budiniškių g., 2 kambarių butas', 'Plotas:': '49,16 m²', 'Kambarių sk.:': '2', 'Metai:': '2022'}
{'Address': 'Vilnius, Senamiestis, Liejyklos g., 4 kambarių butas', 'Plotas:': '55 m²', 'Kambarių sk.:': '4', 'Metai:': '1940'}
{'Address': 'Vilnius, Žirmūnai, Kareivių g., 2 kambarių butas', 'Plotas:': '24,3 m²', 'Kambarių sk.:': '2', 'Metai:': '2020'}

您可以使用以下方式将此写入 output.csv

with open('output.csv', 'w', encoding='utf-8', newline='') as f_output:
    csv_output = csv.DictWriter(f_output, fieldnames=data[0].keys())
    csv_output.writeheader()
    csv_output.writerows(data)

给予 output.csv 首发:

Address,Plotas:,Kambarių sk.:,Metai:
"Vilnius, Markučiai, Pakraščio g., 2 kambarių butas","44,9 m²",2,2023
"Vilnius, Pašilaičiai, Budiniškių g., 2 kambarių butas","49,16 m²",2,2022
"Vilnius, Senamiestis, Liejyklos g., 4 kambarių butas",55 m²,4,1940