繁体   English   中英

使用 beautifulsoup 抓取具有多个页面的列表

[英]Web-Scraping a list with multiple pages with beautifulsoup

我正在尝试从此页面中提取今年的所有条目进行分析。 我写了一个 python 脚本,它确实做到了,而且效果很好。 但是,它仅适用于前 10 个条目,我无法 select 日期范围。

我最好的猜测是解析 URL 中的页码,但据我所知,它不需要任何参数。 我检查了 html 文档中的“下一页”按钮,它们确实有一个href link ,但使用该链接总是会让我回到第 1 页。

现在我有点坚持这一点,真的希望有人能指出我正确的方向。

抱歉这个模糊的问题,我是网络抓取和 HTML 和 Python 的新手,所以我不知道从哪里开始寻找。

这是我当前的代码:

import requests
from bs4 import BeautifulSoup
page = requests.get("https://risi.muenchen.de/risi/antrag/ba/baantraguebersicht?2")
soup = BeautifulSoup(page.content, 'html.parser')

uls = soup.find_all('ul')
antraege = uls[17].findAll('li')
atrgs = list()

for antrag in antraege:
    titel = antrag.find_all('a', class_='headline-link')[0].string.strip()
    beschlossen = antrag.find_all('div', class_='keyvalue-value')[0].string.strip()
    typ = antrag.find_all('div', class_='keyvalue-value')[1].string.strip()
    status = antrag.find_all('div', class_='keyvalue-value')[4].string.strip()
    ba = antrag.find_all('a', class_='icon_action')[0].string.strip()
    referat = antrag.find_all('a', class_='icon_action')[1].string.strip()
    atrg = Antrag(titel, beschlossen, typ, status, ba, referat)
    atrgs.append(atrg)

要获取所有页面,您可以使用下一个示例:

import requests
from bs4 import BeautifulSoup

headers = {
    "Wicket-Ajax": "true",
    "Wicket-Ajax-BaseURL": "antrag/ba/baantraguebersicht?0",
}


def get_info(soup):
    rv = []
    for lg in soup.select("li.list-group-item"):
        title = " ".join(lg.select_one(".headline-link").text.split("\r\n"))
        ba = lg.select_one(
            '.keyvalue-key:-soup-contains("Beschlossen am:") + div'
        ).text.strip()
        # get other info here
        # ...
        rv.append((title, ba))
    return rv


with requests.session() as s:
    # the first page:
    page = s.get("https://risi.muenchen.de/risi/antrag/ba/baantraguebersicht?0")
    soup = BeautifulSoup(page.content, "html.parser")

    counter = 1
    while True:
        
        for title, ba in get_info(soup):
            print(counter, title, ba)
            counter += 1

        # is there next page?
        tag = soup.select_one('[title="Eine Seite vorwärts gehen"]')

        if not tag:
            # no, we are done here:
            break

        headers["Wicket-FocusedElementId"] = tag["id"]

        page = s.get(
            "https://risi.muenchen.de/risi/antrag/ba/baantraguebersicht?0-1.0-color_container-list-cardheader-nav_top-next",
            headers=headers,
        )
        soup = BeautifulSoup(page.content, "xml")
        soup = BeautifulSoup(
            soup.select_one("ajax-response").text, "html.parser"
        )

印刷:

1 Auskunft über geplante Wohnbebauung westlich der Drygalski-Allee 02.08.2022
2 Bestellung einer städtischen Leistung: Finanzierung von Ferien- und Familienpässen für Einrichtun... 02.08.2022
3 Verzögerungen bei der Verlegung von Glasfaserkabeln im 19. Stadtbezirk 02.08.2022
4 Virtuelle Tagungsmöglichkeiten für Unterausschüsse weiter ermöglichen 02.08.2022
5 Offene Fragen zur Schließung des Maria-Einsiedel-Bades 02.08.2022

...

139 Bestellung einer städtischen Leistung, hier: Topo-Box-Einsatz in der Schröfelhofstraße / Ossinger... 11.07.2022
140 Bestellung einer städtischen Leistung, hier: Topo-Box-Einsatz in der Pfingstrosenstraße 11.07.2022
141 Bestellung einer städtischen Leistung; hier: Topo-Box-Einsatz in der Alpenveilchenstraße 11.07.2022

编辑:给 select 一个“Wahlperiod”

import requests
from bs4 import BeautifulSoup

headers = {
    "Wicket-Ajax": "true",
    "Wicket-Ajax-BaseURL": "antrag/ba/baantraguebersicht?0",
}


def get_info(soup):
    rv = []
    for lg in soup.select("li.list-group-item"):
        title = " ".join(lg.select_one(".headline-link").text.split("\r\n"))
        ba = lg.select_one(
            '.keyvalue-key:-soup-contains("Beschlossen am:") + div'
        ).text.strip()
        # get other info here
        # ...
        rv.append((title, ba))
    return rv


with requests.session() as s:
    # the first page:
    page = s.get("https://risi.muenchen.de/risi/antrag/ba/baantraguebersicht?0")
    soup = BeautifulSoup(page.content, "html.parser")

    # select the "wahlperiod 01.05.2008 bis 30.04.2014"
    tag = soup.select_one(
        '.dropdown-item[title="Belegt die Datumsfelder mit dem Datumsbereich von 01.05.2008 bis 30.04.2014"]'
    )

    headers["Wicket-FocusedElementId"] = tag["id"]
    
    # for different wahlperiod change the `periodenEintrag-2` part
    page = s.get(
        "https://risi.muenchen.de/risi/antrag/ba/baantraguebersicht?0-1.0-form-periodeButton-periodenEintrag-2-periode=&_=1660125170317",
        headers=headers,
    )

    # reload first page with new data:
    page = s.get("https://risi.muenchen.de/risi/antrag/ba/baantraguebersicht?0")
    soup = BeautifulSoup(page.content, "html.parser")

    counter = 1
    while True:

        for title, ba in get_info(soup):
            print(counter, title, ba)
            counter += 1

        # is there next page?
        tag = soup.select_one('[title="Eine Seite vorwärts gehen"]')

        if not tag:
            # no, we are done here:
            break

        headers["Wicket-FocusedElementId"] = tag["id"]

        page = s.get(
            "https://risi.muenchen.de/risi/antrag/ba/baantraguebersicht?0-2.0-color_container-list-cardheader-nav_top-next",
            headers=headers,
        )
        soup = BeautifulSoup(page.content, "xml")
        soup = BeautifulSoup(
            soup.select_one("ajax-response").text, "html.parser"
        )

印刷:


...

1836 Willkommen auf der Wärmeinsel München - begünstigt durch Nachverdichtung und Versiegelung in den ... 24.05.2012
1837 Kontingentplätze in Kitas der freien Träger 24.05.2012
1838 Brachliegende Grundstücke in der Messestadt 24.05.2012
1839 Mut zur nachhaltigen Gestaltung - externe kleinteilige B-Pläne  zulassen 24.05.2012
1840 Grundstücksverkauf 4. Bauabschnitt Wohnen in der Messestadt 24.05.2012

...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM