使用Python和BeautifulSoup进行房地产市场刮削

使用Python和BeautifulSoup进行房地产市场刮削,python,parsing,web-scraping,beautifulsoup,Python,Parsing,Web Scraping,Beautifulsoup,我需要一些如何使用Python解析房地产市场的概念。我搜索了一些关于解析网站的信息,我甚至在VBA中做了这项工作,但我想在python中做 这是将被解析的站点(现在只是一个报价,但它将处理全系列的房地产报价,来自kontrakt.szczecin.pl的多个站点): 首先,程序将使用3条信息: 1/信息所在的表格(主要参数): 第351149条、利兹巴·博科伊3条、塞纳335000兹罗提、塞纳扎m2 3350兹罗提(报价数量、房间号、价格、平方米价格等)。然而,信息的数量取决于房地产报价:有时

我需要一些如何使用Python解析房地产市场的概念。我搜索了一些关于解析网站的信息,我甚至在VBA中做了这项工作,但我想在python中做

这是将被解析的站点(现在只是一个报价,但它将处理全系列的房地产报价,来自kontrakt.szczecin.pl的多个站点):

首先,程序将使用3条信息:

1/信息所在的表格(主要参数): 第351149条、利兹巴·博科伊3条、塞纳335000兹罗提、塞纳扎m2 3350兹罗提(报价数量、房间号、价格、平方米价格等)。然而,信息的数量取决于房地产报价:有时是14,有时是12,有时是16等

2/在段落中描述财产(这是程序的另一部分,现在可以跳过):有时在表(1/)中会显示有车库或阳台的信息。但在第段中有一句话,车库是额外的价格(这意味着我的财产没有车库)或阳台是法国式的(这对我来说不是阳台)。 我设法让程序在段落(如garage)中找到正确的单词,并从段落中复制文本,在左侧和右侧添加额外的文本(例如:两侧各有20个字母,但如果单词放在第一位怎么办?)

3/附加参数- 不是每个报价都有,但像这个()一样,有关于酒店阳台数量的信息。有时也有关于地下室的信息。其代码应与1/问题类似

所以我尝试了类似的方法,使用了一些互联网资源(它仍然是不完整的):

它是有效的,但仍然是不完整的。我现在不继续,因为有一个主要的缺陷。正如您看到的上一次打印,它采用索引,但不是每个属性都具有相同的顺序(因为正如我提到的,有时有10条信息,有时更多,有时更少)。这将是一个巨大的混乱在CSV

我的VBA程序是这样工作的:

  • 将表格复制到Excel(第1页)
  • 在表2中有程序正在寻找的参数(如价格)
  • 快捷方式中的机制:从第2页复制参数(价格),转到第1页(其中是解析信息),查找价格字符串(粘贴第2页中的信息:“价格”),转到下面的行,复制价格值,转到第2页,查找价格,转到下面,粘贴价格值。等等
  • 寻找有关概念和编码的帮助

    编辑: 第一部分和第二部分已经准备好了。但是我对第三部分有很大的疑问。代码如下:

    from urllib import request as uReq
    import requests
    #dzięki temu program jest zamykany odrazu, i nie kontynuuje wykonywania reszty kodu. Po imporcie wystarczy exit(0)
    from sys import exit
    from urllib.request import urlopen as uReq2
    from bs4 import BeautifulSoup as soup
    import csv
    import re
    import itertools
    
    filename = 'test.txt'
    
    #licznik, potrzebny do obliczenia ilości numerów ofert w pliku .txt
    num_lines = 0
    
    # tworzymy listę danych i listę URLi. Wyniki będą dodawane do list, dlatego potrzeba jest ich utworzenia (jako puste)
    list_of_lines = ['351238', '351237', '111111', '351353']
    list_of_lines2 = []
    list_of_URLs = []
    list_of_redictered_URLs = []
    KONTRAKT = 'http://www.kontrakt.szczecin.pl'
    
    with open(filename, 'r') as file:
        for line in file:
            #dodajemy linię (ofertę) do listy
            list_of_lines.append(line.strip())
            #num_lines jest licznikiem, wskazuje ile wierszy zawiera lista, zmienna jest istotna w zakresię tworzenia pętli z adresami URL
            num_lines += 1
    
    #tworzymy URLe z Numerów Ofert zawartych w filename
    
    for i in range(num_lines):
        nr_oferty = list_of_lines[i]
        my_url = "http://www.kontrakt.szczecin.pl/lista-ofert/?f_listingId=" + nr_oferty + "&f=&submit=Szukaj"
        list_of_URLs.append(my_url)
    print(list_of_URLs)
    
    
    
    
    #Cześć druga: konwertowanie listy linków na listę linków przekierowanych
    
    #Program wchodzi na stronę, która powinna być przekierowana, jednak ze względu na użyscie Java Scriptu,
    #zadanie zostało utrudnione. Dlatego, też celem programu jest symulowanie przeglądarki, pobranie
    #zawartości strony, a następnie 'wyłuskanie' odpowiedniego linku do przekierowania
    
    i = 0
    for i in range(num_lines):
        url_redirect = list_of_URLs[i]
        my_url = url_redirect
        BROWSER = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36'}
        response = requests.get(my_url, headers=BROWSER)
        script1 = '<script>'
        script2 = '</script>'
        content_URL = str(response.content)
        find_script1 = (content_URL.find(script1))
        find_script2 = (content_URL.find(script2))
        url_ready = content_URL[find_script1:find_script2]
        print(i+1,'z', num_lines, '-', 'oferta nr:', str(my_url[57:57+6]))
        list_of_redictered_URLs.append(url_ready)
    
    #usuwanie zbędnych tagów i znaków, w celu uzyskania czystego przekierowanego linku
    list_of_redictered_URLs = [w.replace('<script>window.location=\\\'','') for w in list_of_redictered_URLs]
    list_of_redictered_URLs = [w.replace('\\\';','') for w in list_of_redictered_URLs]
    #print(list_of_redictered_URLs)
    #usuwanie pustych wierszy z listy (oferty, które są nieakutalne na liste "wchodzą jako puste" !!! item: jest to zmienna, można zamienić np. na janusz.
    filtered_list = list(filter(lambda item: item.strip(), list_of_redictered_URLs))
    filtered_list = [KONTRAKT + item for item in filtered_list]
    #zmiana na tuple, ze względu iż mutowalność (dodawanie kolejnych linków) nie będzie potrzebne
    filtered_list = tuple(filtered_list)
    
    #print(str(filtered_list))
    
    print('Lista linków:\n',filtered_list)
    
    # Kolejną częścią programu jest pobieranie istotnych informacji (parametrów podstawowych)
    # ze strony kontrakt.szczecin.pl, a następnie ich zapisanie w pliku csv.
    
    # Nagłówki w csv oraz nazwy parametrów na stronie (muszą być identyczne jak na stronie, aby mogły
    # zostać odpowiednio przyporządkowane w .csv)
    
    HEADERS = ['Numer oferty',
               'Liczba pokoi',
               'Cena',
               'Cena za m2',
               'Powierzchnia',
               'Piętro',
               'Liczba pięter',
               'Typ kuchni',
               'Balkon',
               'Czynsz administracyjny',
               'Rodzaj ogrzewania',
               'Umeblowanie',
               'Wyposażona kuchnia',
               'Gorąca woda',
               'Rodzaj budynku',
               'Materiał',
               'Rok budowy',
               'Stan nieruchomości',
               'Rynek',
               'Dach:',
               'Liczba balkonów:',
               'Liczba tarasów:',
               'Piwnica:',
               'Ogród:',
               'Ochrona:',
               'Garaż:',
               'Winda:',
               'Kształt działki:',
               'Szerokość działki (mb.):',
               'Długość działki (mb.):',
               'Droga dojazdowa:',
               'Gaz:',
               'Prąd:',
               'Siła:','piwnica',
                'komórk',
                'strych',
                'gospodarcze',
                'postojow',
                'parking',
                'przynależn',
                'garaż',
                'ogród',
                'ogrod',
                'działka',
                'ocieplony',
                'moderniz',
                'restaur',
                'odnow',
                'ociepl',
                'remon',
                'elew',
                'dozór',
                'dozor',
                'monitoring',
                'monit',
                'ochron',
                'alarm',
                'strzeż',
                'portier',
                'wspólnot',
                'spółdziel',
                'kuchni',
                'aneks',
                'widna',
                'ciemna',
                'prześwit',
                'oficyn',
                'linia',
                'zabudow',
                'opłat',
                'bezczynsz',
                'poziom',
                'wind',
                'francuski',
                'ul.',
                'w cenie',
                'dodatkową']
    
    LINKI = ["Link"]
    
    #HEADERS2 = ['Liczba balkonów:',
    #           'Liczba tarasów:',
    #           'Piwnica:',
    #           'Ogród:',
    #           'Ochrona:',
    #           'Garaż:',
    #           'Winda:']
    
    HEADERS3 = ['piwnica',
                'komórk',
                'strych',
                'gospodarcze',
                'postojow',
                'parking',
                'przynależn',
                'garaż',
                'ogród',
                'ogrod',
                'działka',
                'ocieplony',
                'moderniz',
                'restaur',
                'odnow',
                'ociepl',
                'remon',
                'elew',
                'dozór',
                'dozor',
                'monitoring',
                'monit',
                'ochron',
                'alarm',
                'strzeż',
                'portier',
                'wspólnot',
                'spółdziel',
                'kuchni',
                'aneks',
                'widna',
                'ciemna',
                'prześwit',
                'oficyn',
                'linia',
                'zabudow',
                'opłat',
                'bezczynsz',
                'poziom',
                'wind',
                'francuski',
                'ul.',
                'w cenie',
                'dodatkową',]
    
    csv_name = 'data.csv'
    print('Dane zostaną zapisane do pliku:',csv_name + '.csv')
    print('\n>>>>Program rozpoczyna pobieranie danych')
    #Pobieranie linków
    
    i = 0  
    #Tworzy plik csv o nazwie csv
    #writerow może mieć tylko jeden argument, dlatego jest nim suma poszczególnych list. Lista
    #linki ma jędną pozycję, ponieważ można sumować dane jednego typu. Nie można sumować listy ze stringami.
    with open(csv_name + '.csv', 'w', newline='') as csvfile:
        csvwriter = csv.writer(csvfile, delimiter=',', quotechar='"')
        HEADERS_ALL = HEADERS+HEADERS3+LINKI
        csvwriter.writerow(HEADERS_ALL)
    
        for i in range(len(filtered_list)):
            my_url = filtered_list[i]
            with uReq2(my_url) as uClient:
                page_soup = soup(uClient.read(), 'lxml')
                print('\t\t-----------',i+1,'-----------\n',my_url)
    
    
            #<dt> - nazwa parametru np. Kuchnia
            #<dd> - wartość parametru np. widna   
            row = ['-'] * len(HEADERS) + ['-'] * len(HEADERS3) + ['-'] * len(LINKI)
            # Parametry podstawowe (kontrakt.szczecin.pl)
            for dt, dd in zip(page_soup.select('section#quick-summary dt'), page_soup.select('section#quick-summary dd')):
                if dt.text.strip() not in HEADERS:
                    print("\n 1(dt,dd):UWAGA!, kolumna [{}] nie istnieje w nagłówkach! (stała: HEADERS)\n".format(dt.text.strip()))
                    continue
                row[HEADERS.index(dt.text.strip())] = dd.text.strip()
    
            # Parametry dodatkowe
            for span, li in zip(page_soup.select('section#property-features span'), page_soup.select('section#property-features li')):
                if span.text.strip() not in HEADERS:
                    print("\n 2:UWAGA(span,li), kolumna [{}] nie istnieje w nagłówkach (stała HEADERS)!\n".format(span.text.strip()))
                    continue
                row[HEADERS.index(span.text.strip())] = li.text.strip()
            #csvwriter.writerow(row)
            print(row)
    
    #No to zaczynamy zabawę...................................
    
            # zmienna j odnosi się do indeksu HEADERS3, jest to j nie i, ponieważ i jest w dalszym użyciu
            # w pętli powyżej
    
            for p in page_soup.select('section#description'):
                p = str(p)
                p = p.lower() 
    
    
                for j in range(len(HEADERS3)): 
                    #print('j:',j)
                    # find_p znajduje wszystkie słowa kluczowe z HEADERS3 w paragrafie na stronie kontraktu.
                    find_p = re.findall(HEADERS3[j],p)
                    # listy, które wyświetlają pozycję startową poszczególnych słów muszą zaczynać się od '-' lub 0?,
                    # ponieważ, gdy dane słowo nie zostanie odnalezione to listy będą puste w pierwszej iteracji pętli
                    # co w konsekewncji doprowadzi do błędu out of range
                    m_start = []
                    m_end = []
                    lista_j = []
    
                    for m in re.finditer(HEADERS3[j], p):
                        #print((m.start(),m.end()), m.group())
                        m_start.append(m.start())
                        m_end.append(m.end())
    
                    #print(h)
    
                    for k in range(len(m_start)):
                        #właściwe teraz nie wiem po co to jest..
                        try:
                            x = m_start[k]
                            y = m_end[k]
                        except IndexError:
                            x = m_start[0]
                            y = m_end[0]
                        #print('xy:',x,y)
                        #print(find_p) 
                    #print(HEADERS3[j])
                        z = (HEADERS3[j]+':',p[-60+x:y+60]+'    ++-NNN-++') 
                        lista_j.append(z)
                    print (lista_j)
    
    
            print(str(lista_j))
            row[HEADERS.index(span.text.strip())] = str(lista_j)
            csvwriter.writerow(row)
            #print(row)
    
    从urllib导入请求作为uReq
    导入请求
    #dzięki temu项目与zamykany odrazu开玩笑,我是nie Kontynuje Wykonywana reszty kodu。采购订单进口wystarczy出口(0)
    从系统导入退出
    从urllib.request导入urlopen作为uReq2
    从bs4进口美汤作为汤
    导入csv
    进口稀土
    进口itertools
    文件名='test.txt'
    #licznik,potrzebny do obliczenia ilości numerów of ert w pliku.txt
    行数=0
    #双酶列表ędanych i listęURLi。Wyniki będądodawane do list,我在utworzenia开玩笑(jako puste)
    行的列表=['351238','351237','111111','351353']
    第2行的列表=[]
    URL的列表=[]
    重新指定的URL列表=[]
    康特拉克特酒店http://www.kontrakt.szczecin.pl'
    打开(文件名为“r”)作为文件:
    对于文件中的行:
    #多达杰米·里尼(奥弗特·里尼)精力充沛
    列出\u行的\u。追加(line.strip())
    #许多人开玩笑说李茨尼基姆(licznikiem),她是一个聪明的人,她开玩笑说她是一个聪明的人
    行数+=1
    #tworzymy URLe z Numerów of ert zawartych w文件名
    对于范围内的i(num_行):
    nr_of erty=行列表[i]
    我的url=”http://www.kontrakt.szczecin.pl/lista-ofert/?f_listingId=“+nr_of erty+”&f=&submit=Szukaj”
    列出所有url。追加(我的url)
    打印(URL列表)
    #Cześćdruga:konwertowanie listy linków na listęlinków przekierowanych
    #项目由奇普泽基耶罗瓦纳、杰德纳克·瓦兹格尔杜纳和爪哇脚本编写,
    #扎达尼·佐斯塔奥·乌特罗德尼翁。德拉特戈(teżcelem program)与波布拉尼(pobranie)的赛穆洛瓦尼(symulowanie przeglądarki)开玩笑
    #zawartości strony,一位来自普泽基耶罗瓦尼亚的纳斯特·乌斯坎尼(nastśpnie'wyłuskanie'odpowiedniego linku do przekierowania)
    i=0
    对于范围内的i(num_行):
    url\u redirect=url列表[i]
    我的url=url\u重定向
    浏览器={'User-Agent':'Mozilla/5.0(Macintosh;Intel Mac OS X 10_10_1)AppleWebKit/537.36(KHTML,如Gecko)Chrome/39.0.2171.95 Safari/537.36'}
    response=requests.get(my_url,headers=BROWSER)
    脚本1=''
    脚本2=''
    content\u URL=str(response.content)
    find_script1=(content_URL.find(script1))
    find_script2=(content_URL.find(script2))
    url\u ready=content\u url[find\u script1:find\u script2]
    打印(i+1,'z',num_行,'-','oferta nr:',str(my_url[57:57+6]))
    重新指定的url列表。追加(url就绪)
    #乌兹瓦尼·兹德尼奇·塔格沃(zbędnych tagów i znaków)与乌兹别克斯坦-捷克共和国(uzyskania-czystego-przekierowanego-linku)接壤
    重新指定的URL列表=[w.replace('window.location=\\\''',)用于重新指定的URL列表中的w]
    重新指定的URL列表=[w.在重新指定的URL列表中替换('\\';','')w]
    #打印(重新指定的URL列表)
    #usuwanie pustych wierszy z listy(oferty,które sąnieakutalne na liste“wchodząjako puste”!!!项目:与Zmiena开玩笑,można zamienićnp.na janusz。
    过滤的\u列表=列表(过滤器(lambda项:item.strip(),重新指定的\u URL列表))
    过滤列表=[KONTRAKT+过滤列表中项目的项目]
    #zmiana na tuple,ze względu iżmutowalność(dodawanie kolejnych linków)nie będzie potrzebne
    过滤列表=元组(过滤列表)
    #打印(str(过滤列表))
    打印('Lista linków:\n',过滤列表)
    #Kolejnącz÷ciąprogram u jest pobieranie isttnych informacji(parametrów podstawowych)
    #ze strony kontrakt.szczecin.pl,一位来自中国的学生。
    #Na
    
    from urllib import request as uReq
    import requests
    #dzięki temu program jest zamykany odrazu, i nie kontynuuje wykonywania reszty kodu. Po imporcie wystarczy exit(0)
    from sys import exit
    from urllib.request import urlopen as uReq2
    from bs4 import BeautifulSoup as soup
    import csv
    import re
    import itertools
    
    filename = 'test.txt'
    
    #licznik, potrzebny do obliczenia ilości numerów ofert w pliku .txt
    num_lines = 0
    
    # tworzymy listę danych i listę URLi. Wyniki będą dodawane do list, dlatego potrzeba jest ich utworzenia (jako puste)
    list_of_lines = ['351238', '351237', '111111', '351353']
    list_of_lines2 = []
    list_of_URLs = []
    list_of_redictered_URLs = []
    KONTRAKT = 'http://www.kontrakt.szczecin.pl'
    
    with open(filename, 'r') as file:
        for line in file:
            #dodajemy linię (ofertę) do listy
            list_of_lines.append(line.strip())
            #num_lines jest licznikiem, wskazuje ile wierszy zawiera lista, zmienna jest istotna w zakresię tworzenia pętli z adresami URL
            num_lines += 1
    
    #tworzymy URLe z Numerów Ofert zawartych w filename
    
    for i in range(num_lines):
        nr_oferty = list_of_lines[i]
        my_url = "http://www.kontrakt.szczecin.pl/lista-ofert/?f_listingId=" + nr_oferty + "&f=&submit=Szukaj"
        list_of_URLs.append(my_url)
    print(list_of_URLs)
    
    
    
    
    #Cześć druga: konwertowanie listy linków na listę linków przekierowanych
    
    #Program wchodzi na stronę, która powinna być przekierowana, jednak ze względu na użyscie Java Scriptu,
    #zadanie zostało utrudnione. Dlatego, też celem programu jest symulowanie przeglądarki, pobranie
    #zawartości strony, a następnie 'wyłuskanie' odpowiedniego linku do przekierowania
    
    i = 0
    for i in range(num_lines):
        url_redirect = list_of_URLs[i]
        my_url = url_redirect
        BROWSER = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36'}
        response = requests.get(my_url, headers=BROWSER)
        script1 = '<script>'
        script2 = '</script>'
        content_URL = str(response.content)
        find_script1 = (content_URL.find(script1))
        find_script2 = (content_URL.find(script2))
        url_ready = content_URL[find_script1:find_script2]
        print(i+1,'z', num_lines, '-', 'oferta nr:', str(my_url[57:57+6]))
        list_of_redictered_URLs.append(url_ready)
    
    #usuwanie zbędnych tagów i znaków, w celu uzyskania czystego przekierowanego linku
    list_of_redictered_URLs = [w.replace('<script>window.location=\\\'','') for w in list_of_redictered_URLs]
    list_of_redictered_URLs = [w.replace('\\\';','') for w in list_of_redictered_URLs]
    #print(list_of_redictered_URLs)
    #usuwanie pustych wierszy z listy (oferty, które są nieakutalne na liste "wchodzą jako puste" !!! item: jest to zmienna, można zamienić np. na janusz.
    filtered_list = list(filter(lambda item: item.strip(), list_of_redictered_URLs))
    filtered_list = [KONTRAKT + item for item in filtered_list]
    #zmiana na tuple, ze względu iż mutowalność (dodawanie kolejnych linków) nie będzie potrzebne
    filtered_list = tuple(filtered_list)
    
    #print(str(filtered_list))
    
    print('Lista linków:\n',filtered_list)
    
    # Kolejną częścią programu jest pobieranie istotnych informacji (parametrów podstawowych)
    # ze strony kontrakt.szczecin.pl, a następnie ich zapisanie w pliku csv.
    
    # Nagłówki w csv oraz nazwy parametrów na stronie (muszą być identyczne jak na stronie, aby mogły
    # zostać odpowiednio przyporządkowane w .csv)
    
    HEADERS = ['Numer oferty',
               'Liczba pokoi',
               'Cena',
               'Cena za m2',
               'Powierzchnia',
               'Piętro',
               'Liczba pięter',
               'Typ kuchni',
               'Balkon',
               'Czynsz administracyjny',
               'Rodzaj ogrzewania',
               'Umeblowanie',
               'Wyposażona kuchnia',
               'Gorąca woda',
               'Rodzaj budynku',
               'Materiał',
               'Rok budowy',
               'Stan nieruchomości',
               'Rynek',
               'Dach:',
               'Liczba balkonów:',
               'Liczba tarasów:',
               'Piwnica:',
               'Ogród:',
               'Ochrona:',
               'Garaż:',
               'Winda:',
               'Kształt działki:',
               'Szerokość działki (mb.):',
               'Długość działki (mb.):',
               'Droga dojazdowa:',
               'Gaz:',
               'Prąd:',
               'Siła:','piwnica',
                'komórk',
                'strych',
                'gospodarcze',
                'postojow',
                'parking',
                'przynależn',
                'garaż',
                'ogród',
                'ogrod',
                'działka',
                'ocieplony',
                'moderniz',
                'restaur',
                'odnow',
                'ociepl',
                'remon',
                'elew',
                'dozór',
                'dozor',
                'monitoring',
                'monit',
                'ochron',
                'alarm',
                'strzeż',
                'portier',
                'wspólnot',
                'spółdziel',
                'kuchni',
                'aneks',
                'widna',
                'ciemna',
                'prześwit',
                'oficyn',
                'linia',
                'zabudow',
                'opłat',
                'bezczynsz',
                'poziom',
                'wind',
                'francuski',
                'ul.',
                'w cenie',
                'dodatkową']
    
    LINKI = ["Link"]
    
    #HEADERS2 = ['Liczba balkonów:',
    #           'Liczba tarasów:',
    #           'Piwnica:',
    #           'Ogród:',
    #           'Ochrona:',
    #           'Garaż:',
    #           'Winda:']
    
    HEADERS3 = ['piwnica',
                'komórk',
                'strych',
                'gospodarcze',
                'postojow',
                'parking',
                'przynależn',
                'garaż',
                'ogród',
                'ogrod',
                'działka',
                'ocieplony',
                'moderniz',
                'restaur',
                'odnow',
                'ociepl',
                'remon',
                'elew',
                'dozór',
                'dozor',
                'monitoring',
                'monit',
                'ochron',
                'alarm',
                'strzeż',
                'portier',
                'wspólnot',
                'spółdziel',
                'kuchni',
                'aneks',
                'widna',
                'ciemna',
                'prześwit',
                'oficyn',
                'linia',
                'zabudow',
                'opłat',
                'bezczynsz',
                'poziom',
                'wind',
                'francuski',
                'ul.',
                'w cenie',
                'dodatkową',]
    
    csv_name = 'data.csv'
    print('Dane zostaną zapisane do pliku:',csv_name + '.csv')
    print('\n>>>>Program rozpoczyna pobieranie danych')
    #Pobieranie linków
    
    i = 0  
    #Tworzy plik csv o nazwie csv
    #writerow może mieć tylko jeden argument, dlatego jest nim suma poszczególnych list. Lista
    #linki ma jędną pozycję, ponieważ można sumować dane jednego typu. Nie można sumować listy ze stringami.
    with open(csv_name + '.csv', 'w', newline='') as csvfile:
        csvwriter = csv.writer(csvfile, delimiter=',', quotechar='"')
        HEADERS_ALL = HEADERS+HEADERS3+LINKI
        csvwriter.writerow(HEADERS_ALL)
    
        for i in range(len(filtered_list)):
            my_url = filtered_list[i]
            with uReq2(my_url) as uClient:
                page_soup = soup(uClient.read(), 'lxml')
                print('\t\t-----------',i+1,'-----------\n',my_url)
    
    
            #<dt> - nazwa parametru np. Kuchnia
            #<dd> - wartość parametru np. widna   
            row = ['-'] * len(HEADERS) + ['-'] * len(HEADERS3) + ['-'] * len(LINKI)
            # Parametry podstawowe (kontrakt.szczecin.pl)
            for dt, dd in zip(page_soup.select('section#quick-summary dt'), page_soup.select('section#quick-summary dd')):
                if dt.text.strip() not in HEADERS:
                    print("\n 1(dt,dd):UWAGA!, kolumna [{}] nie istnieje w nagłówkach! (stała: HEADERS)\n".format(dt.text.strip()))
                    continue
                row[HEADERS.index(dt.text.strip())] = dd.text.strip()
    
            # Parametry dodatkowe
            for span, li in zip(page_soup.select('section#property-features span'), page_soup.select('section#property-features li')):
                if span.text.strip() not in HEADERS:
                    print("\n 2:UWAGA(span,li), kolumna [{}] nie istnieje w nagłówkach (stała HEADERS)!\n".format(span.text.strip()))
                    continue
                row[HEADERS.index(span.text.strip())] = li.text.strip()
            #csvwriter.writerow(row)
            print(row)
    
    #No to zaczynamy zabawę...................................
    
            # zmienna j odnosi się do indeksu HEADERS3, jest to j nie i, ponieważ i jest w dalszym użyciu
            # w pętli powyżej
    
            for p in page_soup.select('section#description'):
                p = str(p)
                p = p.lower() 
    
    
                for j in range(len(HEADERS3)): 
                    #print('j:',j)
                    # find_p znajduje wszystkie słowa kluczowe z HEADERS3 w paragrafie na stronie kontraktu.
                    find_p = re.findall(HEADERS3[j],p)
                    # listy, które wyświetlają pozycję startową poszczególnych słów muszą zaczynać się od '-' lub 0?,
                    # ponieważ, gdy dane słowo nie zostanie odnalezione to listy będą puste w pierwszej iteracji pętli
                    # co w konsekewncji doprowadzi do błędu out of range
                    m_start = []
                    m_end = []
                    lista_j = []
    
                    for m in re.finditer(HEADERS3[j], p):
                        #print((m.start(),m.end()), m.group())
                        m_start.append(m.start())
                        m_end.append(m.end())
    
                    #print(h)
    
                    for k in range(len(m_start)):
                        #właściwe teraz nie wiem po co to jest..
                        try:
                            x = m_start[k]
                            y = m_end[k]
                        except IndexError:
                            x = m_start[0]
                            y = m_end[0]
                        #print('xy:',x,y)
                        #print(find_p) 
                    #print(HEADERS3[j])
                        z = (HEADERS3[j]+':',p[-60+x:y+60]+'    ++-NNN-++') 
                        lista_j.append(z)
                    print (lista_j)
    
    
            print(str(lista_j))
            row[HEADERS.index(span.text.strip())] = str(lista_j)
            csvwriter.writerow(row)
            #print(row)
    
    from urllib.request import urlopen as uReq
    from bs4 import BeautifulSoup as soup
    import csv
    
    # my_url = 'http://www.kontrakt.szczecin.pl/mieszkanie-sprzedaz-6664m2-339600pln-potulicka-nowe-miasto-szczecin-zachodniopomorskie,351165'
    my_url = 'http://www.kontrakt.szczecin.pl/mieszkanie-sprzedaz-100m2-335000pln-grudziadzka-pomorzany-szczecin-zachodniopomorskie,351149'
    
    with uReq(my_url) as uClient:
        page_soup = soup(uClient.read(), 'lxml')
    
    
    with open('data.csv', 'w', newline='') as csvfile:
        csvwriter = csv.writer(csvfile, delimiter=',', quotechar='"')
    
        for dt, dd in zip(page_soup.select('section#quick-summary dt'), page_soup.select('section#quick-summary dd')):
            csvwriter.writerow([dt.text.strip(), dd.text.strip()])
    
    from urllib.request import urlopen as uReq
    from bs4 import BeautifulSoup as soup
    import csv
    
    # my_url = 'http://www.kontrakt.szczecin.pl/mieszkanie-sprzedaz-6664m2-339600pln-potulicka-nowe-miasto-szczecin-zachodniopomorskie,351165'
    my_url = 'http://www.kontrakt.szczecin.pl/mieszkanie-sprzedaz-100m2-335000pln-grudziadzka-pomorzany-szczecin-zachodniopomorskie,351149'
    
    with uReq(my_url) as uClient:
        page_soup = soup(uClient.read(), 'lxml')
    
    headers = ['Numer oferty',
               'Liczba pokoi',
               'Cena',
               'Cena za m2',
               'Powierzchnia',
               'Piętro',
               'Liczba pięter',
               'Typ kuchni',
               'Balkon',
               'Czynsz administracyjny',
               'Rodzaj ogrzewania',
               'Gorąca woda',
               'Rodzaj budynku',
               'Materiał',
               'Rok budowy',
               'Stan nieruchomości',
               'Rynek',
               'Dach:',
               'Liczba balkonów:',
               'Piwnica:',
               'Kształt działki:',
               'Szerokość działki (mb.):',
               'Długość działki (mb.):',
               'Droga dojazdowa:',
               'Gaz:',
               'Prąd:',
               'Siła:']
    
    with open('data.csv', 'w', newline='') as csvfile:
        csvwriter = csv.writer(csvfile, delimiter=',', quotechar='"')
        csvwriter.writerow(headers)
    
        row = ['-'] * len(headers)
        for dt, dd in zip(page_soup.select('section#quick-summary dt'), page_soup.select('section#quick-summary dd')):
            if dt.text.strip() not in headers:
                print("Warning, column [{}] doesn't exist in headers!".format(dt.text.strip()))
                continue
            row[headers.index(dt.text.strip())] = dd.text.strip()
        csvwriter.writerow(row)