如果前一个元素是 x,那么 return 它

If previous element is x, then return it

我需要为此页面构建一个网络抓取工具:https://www.valchov.cz/sluzby/specialni-sluzby-/

我已经想出了如何通过使用 previous_sibling 获取 "Vyvěšeno""Sejmuto",但现在我需要获取所有 div(到一个变量中)。我认为一些 if 语句会有所帮助。

上面有时有 1 个,有时最多有 3 个 div。

我当前数组中的样本:

['11.\xa0veřejné zasedání zastupitelstva obce se uskuteční 21.\xa012.\xa02011 v\xa019.30\xa0v\xa0budově obecního\xa0úřadu.', 'Vyvěšeno: 13. 12. 2011', 'Sejmuto: 21. 12. 2011']

代码:

from bs4 import BeautifulSoup
import requests
import re
from csv import writer

url= "https://www.valchov.cz/sluzby/specialni-sluzby-/"
page = requests.get(url)

soup = BeautifulSoup(page.content, "html.parser")
sejmuto = soup.find_all("p", string=re.compile("Sejmuto:"))

with open("listings.csv", "w", encoding="utf8") as f:
    thewriter = writer(f)
    header= ["Name", "Name bezdiakritikyamezer" , "URL", "Zveřejněno", "Sejmuto"]
    thewriter.writerow(header)

for hhh in sejmuto:
    item1 = hhh.previous_sibling.previous_sibling.text
    itemz = hhh.previous_sibling.previous_sibling.previous_sibling.previous_sibling.text
    item2 = (hhh.text)
    item = [itemz, item1, item2]
    print(item)

问题和预期输出不是那么清楚,但假设您的目标是获取所有链接并应用相应的日期,我建议您以这种方式调整您的脚本:

  1. 您不需要额外的 re 模块而是使用 css selectors:

    soup.select('p:-soup-contains("Sejmuto")')
    
  2. Select 并迭代所有 find_previous_siblings(),检查它是否包含 <a> 并将您的行写入 csv 否则中断 for 循环并继续:

    for ps in e.find_previous('p').find_previous_siblings():
        if ps.a:
            name = ps.a.text
            url = ps.a.get('href')
            zve = e.find_previous('p').text.split(':')[-1]
            sej = e.text.split('Sejmuto')[-1].strip('.:')
            item = [name, url, zve, sej]
            thewriter.writerow(item)
    
        elif 'Přílohy' in ps.text:
            continue
        else:
            break
    

注意 有一些不规则和不正确的拼写/标点符号(“:”、“.”或没有这些)

例子
from bs4 import BeautifulSoup
import requests
from csv import writer

url= "https://www.valchov.cz/sluzby/specialni-sluzby-/"
page = requests.get(url)

soup = BeautifulSoup(page.content, "html.parser")


with open("listings.csv", "w", encoding="utf8") as f:
    thewriter = writer(f)
    header= ["Name", "URL", "Zveřejněno", "Sejmuto"]
    thewriter.writerow(header)

    for e in soup.select('p:-soup-contains("Sejmuto")'):
        for ps in e.find_previous('p').find_previous_siblings():
            if ps.a:
                name = ps.a.text
                url = ps.a.get('href')
                zve = e.find_previous('p').text.split(':')[-1]
                sej = e.text.split('Sejmuto')[-1].strip('.:')
                item = [name, url, zve, sej]
                thewriter.writerow(item)

            elif 'Přílohy' in ps.text:
                continue
            else:
                break
输出
Name URL Zveřejněno Sejmuto
Zpráva o výsledku přezkumu hospodaření Svazku obcí Boskovicko za rok 2021 https://valchov.webnode.cz/_files/200212352-b8a6db8a6f/Zpr%C3%A1va%20o%20v%C3%BDsledku%20p%C5%99ezkumu%20hospoda%C5%99en%C3%AD%202021%20anonym.pdf?_ga=2.254591048.1500514720.1653284487-1038960091.1606374959 23. 5. 2022
Návrh Závěrečného účtu Svazku obcí Boskovicko za rok 2021 https://valchov.webnode.cz/_files/200212351-4d5044d506/n%C3%A1vrh%20Z%C3%9A%20Svazku%20obc%C3%AD%20Boskovicko%202021%20v%20pln%C3%A9m%20rozsahu.pdf?_ga=2.250537158.1500514720.1653284487-1038960091.1606374959 23. 5. 2022
Zpráva z přezkumu hospodaření za rok 2021 DSO Technické služby malá Haná https://valchov.webnode.cz/_files/200212345-6733c6733d/Zpr%C3%A1va%20o%20v%C3%BDsledku%20p%C5%99ezkoum%C3%A1n%C3%AD%20hospoda%C5%99en%C3%AD%20anonym.pdf 23. 5. 2022
Návrh závěrečného účtu za rok 2021 DSO Technické služby Malá Haná https://valchov.webnode.cz/_files/200212344-6bf056bf08/n%C3%A1vrh%20z%C3%A1v%C4%9Bre%C4%8Dn%C3%A9ho%20%C3%BA%C4%8Dtu%20DSO%20v%20pln%C3%A9m%20rozsahu.pdf 23. 5. 2022
Příloha č. 8 - Výkaz pro hodnocení plnění rozpočtu obce Valchov v roce 2021 https://valchov.webnode.cz/_files/200212342-85ad885ada/P%C5%99%C3%ADloha%20%C4%8D.%208_V%C3%BDkaz%20pro%20hodnocen%C3%AD%20pln%C4%9Bn%C3%AD%20rozpo%C4%8Dtu%20obec%20Valchov%20v%20roce%202021.pdf?_ga=2.213369044.1500514720.1653284487-1038960091.1606374959 23. 5. 2022 30. 6. 2022
Příloha č. 7 - Příloha MŠ Vachov 2021 https://valchov.webnode.cz/_files/200212341-c798fc7991/P%C5%99%C3%ADloha%20%C4%8D.%207_P%C5%99%C3%ADloha%20M%C5%A0%20Valchov_2021.pdf?_ga=2.213369044.1500514720.1653284487-1038960091.1606374959 23. 5. 2022 30. 6. 2022
Příloha č. 6 - Rozvaha MŠ Valchov 2021 https://valchov.webnode.cz/_files/200212340-37dd337dd5/P%C5%99%C3%ADloha%20%C4%8D.%206_Rozvah%20M%C5%A0%20Valchov_2021.pdf?_ga=2.213369044.1500514720.1653284487-1038960091.1606374959 23. 5. 2022 30. 6. 2022
Příloha č. 5 - Výkaz zisku a ztráty MŠ Valchov 2021 https://valchov.webnode.cz/_files/200212339-3e3a43e3a6/P%C5%99%C3%ADloha%20%C4%8D.%205_V%C3%BDkaz%20zisku%20a%20ztr%C3%A1ty%20M%C5%A0%20Valchov_2021.pdf?_ga=2.213369044.1500514720.1653284487-1038960091.1606374959 23. 5. 2022 30. 6. 2022

...