bs4: циклический просмотр нескольких страниц и сбор элементов по классам в выводе csv - PullRequest
0 голосов
/ 04 мая 2020

Я пытаюсь собрать небольшую порцию информации с сайта: извлечь данные и сохранить их в наборе CSV-данных. Проект: для списка контактных данных общественных служб и официальной службы поддержки в городах и деревнях: - приблизительно 1600 записей

базовый c -сайт: https://www.service-bw.de/web/guest/trefferliste/-/trefferliste/q-rathaus

страница с подробной информацией: Rathaus [Gemeinde Grünkraut] https://www.service-bw.de/web/guest/organisationseinheit/-/sbw-oe/Rathaus-6000566-organisationseinheit-0

примечание: мы получили приблизительно 1600 страниц ... поэтому один из главных вопросов - как собрать их в шоу ... как сделать l oop на всех страницах, которые содержат данные

<div class="sp-m-organisationseinheitDetails-basisInfos-content sp-l-grid-container"> 
<div class="sp-l-grid-row"> 
<div class="sp-l-grid-col-md-6 sp-l-grid-col-sm-6 sp-l-grid-xs-col-12"> 
<div> <div itemprop="address" itemscope="itemscope" itemtype="http://schema.org/PostalAddress" class="sp-m-organisationseinheitDetails-basisInfos-addressBlock"> 
<h4 class="sp-m-organisationseinheitDetails-basisInfos-detailsTitle mdash">Hausanschrift</h4> 
<div itemprop="streetAddress"> <span>Scherzachstr.</span> <span>2</span><br> 

Желаемый результат:

Hausanschrift: 
- name 
- street & housenumber
- postal code & town 


Kontaktmöglichkeiten:
- telehon
- fax
- e-mail 
- internet 

видеть на изображении порцию информации, которая есть в каждой записи - в каждой из более чем 1600 записей ...:

enter image description here

мой подход :

import requests
from bs4 import BeautifulSoup
from concurrent.futures.thread import ThreadPoolExecutor

url = "https://www.service-bw.de/web/guest/trefferliste/-/trefferliste/q-rathaus{}"


def main(url, num):
    with requests.Session() as req:
        print(f"Collecting Page# {num}")
        r = req.get(url.format(num))
        soup = BeautifulSoup(r.content, 'html.parser')
        link = [item.get("href")
                for item in soup.findAll("a", rel="bookmark")]
        return set(link)


with ThreadPoolExecutor(max_workers=20) as executor:
    futures = [executor.submit(main, url, num)
               for num in [""]+[f"page/{x}/" for x in range(2, 50)]]

allin = []
for future in futures:
    allin.extend(future.result())


 soup = BeautifulSoup(r.content, 'html.parser')
        target = [item.get_text(strip=True, separator=" ") for item in soup.find(
            "h4", class_="sp-m-organisationseinheitDetails-basisInfos-content sp-l-grid-container").find_next("ul").findAll("dd itemprop")[:8]]
        head = [soup.find("h4", class_="plugin-title").text]
        new = [x for x in target if x.startswith(
            ("Telefon", "Fax", "E-Mail", "Internet"))]
        return head + new


with ThreadPoolExecutor(max_workers=50) as executor1:
    futures1 = [executor1.submit(parser, url) for url in allin]

for future in futures1:
    print(future.result())

кстати. возможно, нам удастся получить дальнейшее (тоже дополнительный контент) - но в данный момент я пытаюсь понять, как получить базовый c контроль за получением страниц и их синтаксическим анализом в целом ...

где я застрял: я получаю ошибки: File "C:\Users\Kasper\Documents_f_s_j_mk__dev_\bs\bw.py", line 28 target = [item.get_text(strip=True, separator=" ") for item in soup.find( ^ IndentationError: unexpected indent [Finished in 0.32s] но кроме этого я подозреваю, что весь код работает хорошо и выбирает все нужные элементы.

Возможно, у вас есть подсказка для меня и дать некоторое руководство .. спасибо заранее.

1 Ответ

1 голос
/ 05 мая 2020
import requests
from bs4 import BeautifulSoup
from concurrent.futures.thread import ThreadPoolExecutor
from colorama import Fore, Style


req = requests.Session()

params = {
    "p_p_id": "suchergebnisse_WAR_suchegui",
    "p_p_lifecycle": "2",
    "p_p_state": "normal",
    "p_p_mode": "view",
    "p_p_resource_id": "nextHits",
    "p_p_cacheability": "cacheLevelPage",
    "p_p_col_id": "column-1",
    "p_p_col_count": "1"
}

data = {
    "q": ""
}


def soup(content):
    soup = BeautifulSoup(content, 'html.parser')
    target = [item['href']
              for item in soup.select("a[id^=organisationseinheit]")]
    return target


def main(url):
    r = req.get(url)
    urls = soup(r.content)
    print("Extracting Page 1")
    return urls


go = main("https://www.service-bw.de/web/guest/trefferliste/-/trefferliste/q-rathaus")


def second(url):
    links = []
    for page in range(1, 166):
        print(f"Extracting Page {page + 1}")
        r = req.get(url,
                    params=params, data=data)
        urls = soup(r.content)
        links.extend(urls)
    return links


allin = go + second("https://www.service-bw.de/web/guest/trefferliste")


print(f"Catched {len(allin)} Links")


def third(url):
    r = req.get(url)
    parser = BeautifulSoup(r.content, 'html.parser')
    print(url)
    try:
        part1 = [item.text for item in parser.find("div", itemprop="streetAddress").parent.findAll(
            "span", text=True)]
    except AttributeError:
        part1 = ["N/A"]
    try:
        part2 = [item.text for item in parser.select(
            "dd.sp-l-grid-col-md-7")[:4]]
    except AttributeError:
        part2 = ["N/A"]
    finish = part1+part2
    return finish


with ThreadPoolExecutor(max_workers=30) as executor:
    futures = executor.map(third, allin)

    for future in futures:
        print(f"{Fore.GREEN}{future}{Style.RESET_ALL}")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...