我正在寻找一份志愿服务的公开名单-欧洲的服务:我不需要完整的地址-但名称和网站.我想到的是数据.XML、CSV...有了这些字段:姓名、国家-以及一些额外的字段,每个存在的国家都会有一个记录.btw:欧洲志愿服务对年轻人来说是很好的 Select

我找到了一个非常好的页面,它非常非常全面--请参见

我想从欧洲网站上托管的european volunteering services个网站中收集数据:

https://youth.europa.eu/go-abroad/volunteering/opportunities_en

我们在那里有数百个志愿服务机会--这些机会存储在如下网站中:

 https://youth.europa.eu/solidarity/placement/39020_en 

https://youth.europa.eu/solidarity/placement/38993_en 

https://youth.europa.eu/solidarity/placement/38973_en 

https://youth.europa.eu/solidarity/placement/38972_en 

https://youth.europa.eu/solidarity/placement/38850_en 

https://youth.europa.eu/solidarity/placement/38633_en

idea:

我认为收集数据-即使用基于BS4requests的刮刀-解析数据并随后在dataframe中打印数据将是非常棒的

嗯-我想我们可以遍历所有的URL:

placement/39020_en 
placement/38993_en 
placement/38973_en 
placement/38850_en 

我认为我们可以在存储中从0迭代到100000,以获取存储在放置中的所有结果.但这一 idea 并没有得到代码的支持.换句话说,目前我还不知道如何在这么大的范围内迭代这个特殊的 idea :

目前我认为-这是一个基本的方法,从这个开始:

import requests
from bs4 import BeautifulSoup
import pandas as pd

# List of URLs to scrape
urls = [
    "https://youth.europa.eu/solidarity/placement/39020_en",
    "https://youth.europa.eu/solidarity/placement/38993_en",
    "https://youth.europa.eu/solidarity/placement/38973_en",
    "https://youth.europa.eu/solidarity/placement/38972_en",
    "https://youth.europa.eu/solidarity/placement/38850_en",
    "https://youth.europa.eu/solidarity/placement/38633_en"
]

# Function to scrape data from a single URL
def scrape_data(url):
    response = requests.get(url)
    soup = BeautifulSoup(response.content, 'html.parser')
    
    # Extracting relevant data
    title = soup.find("h2").text.strip()
    location = soup.find("span", class_="field--name-field-placement-location").text.strip()
    start_date = soup.find("span", class_="field--name-field-placement-start-date").text.strip()
    end_date = soup.find("span", class_="field--name-field-placement-end-date").text.strip()
    
    # Returning data as dictionary
    return {
        "Title": title,
        "Location": location,
        "Start Date": start_date,
        "End Date": end_date,
        "URL": url
    }

# Scrape data from all URLs
data = []
for url in urls:
    data.append(scrape_data(url))

# Convert data to DataFrame
df = pd.DataFrame(data)

# Print DataFrame
print(df)

这给我带来了以下内容

AttributeError                            Traceback (most recent call last)

<ipython-input-1-e65c612df65e> in <cell line: 37>()
     36 data = []
     37 for url in urls:
---> 38     data.append(scrape_data(url))
     39 
     40 # Convert data to DataFrame

<ipython-input-1-e65c612df65e> in scrape_data(url)
     20     # Extracting relevant data
     21     title = soup.find("h2").text.strip()
---> 22     location = soup.find("span", class_="field--name-field-placement-location").text.strip()
     23     start_date = soup.find("span", class_="field--name-field-placement-start-date").text.strip()
     24     end_date = soup.find("span", class_="field--name-field-placement-end-date").text.strip()

AttributeError: 'NoneType' object has no attribute 'text'

推荐答案

首先判断您要 Select 的元素是否包含在response/soup中;您正在寻址的元素似乎不存在.因此,正如@John Gordon所提到的,您的 Select 是没有找到任何东西.

您可以像这样 Select 您的元素-在此处使用css selectors:

# Extracting relevant data
title = soup.h1.get_text(', ',strip=True)
location = soup.select_one('p:has(i.fa-location-arrow)').get_text(', ',strip=True)
start_date,end_date = (e.get_text(strip=True)for e in soup.select('span.extra strong')[-2:])
Title Location Start Date End Date URL
0 Supporting GOB's Sustainable Gardening Project "Es Viver" c/ Camí des Castell, 53, 07702 Maó, Menorca, Spain 01/06/2024 31/05/2025 https://youth.europa.eu/solidarity/placement/39020_en
1 EUROPEAN VOLUNTEERING VS DEPOPULATION 3.0 47400 Medina del Campo (VALLADOLID), Spain 31/05/2024 30/03/2025 https://youth.europa.eu/solidarity/placement/38993_en
2 SUPPORTING LOCAL COMMUNITIES: ASMISAF/AUNA Inclusión Gandia, Spain 01/06/2024 30/06/2025 https://youth.europa.eu/solidarity/placement/38973_en
3 SUPPORTING LOCAL COMMUNITIES: Caritas Gandia Gandia, Spain 01/06/2024 30/06/2025 https://youth.europa.eu/solidarity/placement/38972_en
4 Pedagogic farm based on equine assisted interventions + social service Masía Cal Taulé s/n, 08673 Serrateix, Spain 01/03/2024 31/03/2025 https://youth.europa.eu/solidarity/placement/38850_en
5 Suporting in a Rural Area Plaza de Tuy, 6, 34440 Frómista, Spain 04/03/2024 04/11/2024 https://youth.europa.eu/solidarity/placement/38633_en

Python相关问答推荐

使用Keras的线性回归参数估计

管道冻结和管道卸载

使用groupby Pandas的一些操作

无法使用requests或Selenium抓取一个href链接

在含噪声的3D点网格中识别4连通点模式

如何根据一列的值有条件地 Select 前N组?

多处理队列在与Forking http.server一起使用时随机跳过项目

python中的解释会在后台调用函数吗?

判断solve_ivp中的事件

在Admin中显示从ManyToMany通过模型的筛选结果

Flask运行时无法在Python中打印到控制台

统计numpy. ndarray中的项目列表出现次数的最快方法

为什么dict. items()可以快速查找?

极点替换值大于组内另一个极点数据帧的最大值

SpaCy:Regex模式在基于规则的匹配器中不起作用

随机森林n_估计器的计算

如何将列表从a迭代到z-以抓取数据并将其转换为DataFrame?

将索引表转换为Numy数组

为什么fizzbuzz在两个数字的条件出现在一个数字的条件之后时不起作用?

搜索结果未显示.我的URL选项卡显示:http://127.0.0.1:8000/search?";,而不是这个:";http://127.0.0.1:8000/search?q=name";