[英]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.