我只想从主页上刮取某些文章。更具体地说,我试图只从子页面媒体和子页面Press releases中刮取文章Governing Council decisionsPress conferencesMonetary policy accountsSpeechesInterviews,还有那些用英语写的
我设法(基于一些教程和其他SE:overflow答案)编写了一个代码,从网站上完全删除所有内容,因为我最初的想法是删除所有内容,然后在数据框中稍后清除输出,但网站包含的内容太多,过了一段时间它总是会冻结
获取子链接:
import requests
import re
from bs4 import BeautifulSoup
master_request = requests.get("https://www.ecb.europa.eu/")
base_url = "https://www.ecb.europa.eu"
master_soup = BeautifulSoup(master_request.content, 'html.parser')
master_atags = master_soup.find_all("a", href=True)
master_links = [ ]
sub_links = {}
for master_atag in master_atags:
master_href = master_atag.get('href')
master_href = base_url + master_href
print(master_href)
master_links.append(master_href)
sub_request = requests.get(master_href)
sub_soup = BeautifulSoup(sub_request.content, 'html.parser')
sub_atags = sub_soup.find_all("a", href=True)
sub_links[master_href] = []
for sub_atag in sub_atags:
sub_href = sub_atag.get('href')
sub_links[master_href].append(sub_href)
print("\t"+sub_href)
我尝试过的一些事情是将基本链接更改为子链接——我的想法是,也许我可以对每个子页面单独执行,然后将链接放在一起,但这不起作用)。我尝试的其他事情是用以下内容替换第17行:
sub_atags = sub_soup.find_all("a",{'class': ['doc-title']}, herf=True)
这似乎部分解决了我的问题,因为即使它不只是从子页面获得链接,它至少忽略了不是“文档标题”的链接,这些链接都是网站上的文本链接,但仍然太多,一些链接没有正确检索
我还尝试了以下方法:
for master_atag in master_atags:
master_href = master_atag.get('href')
for href in master_href:
master_href = [base_url + master_href if str(master_href).find(".en") in master_herf
print(master_href)
我认为,因为所有带有英文文档的href中的某个地方都有.en,所以这只会给我所有链接,.en出现在href中的某个地方,但是这段代码给了我打印(master_href)的语法错误,我不理解,因为以前的打印(master_href)工作正常
接下来,我想从子链接中提取以下信息。这部分代码在我测试单个链接时可以工作,但我从来没有机会在上面的代码上尝试它,因为它无法完成运行。一旦我设法获得所有链接的正确列表,这是否有效
for links in sublinks:
resp = requests.get(sublinks)
soup = BeautifulSoup(resp.content, 'html5lib')
article = soup.find('article')
title = soup.find('title')
textdate = soup.find('h2')
paragraphs = article.find_all('p')
matches = re.findall('(\d{2}[\/ ](\d{2}|January|Jan|February|Feb|March|Mar|April|Apr|May|May|June|Jun|July|Jul|August|Aug|September|Sep|October|Oct|November|Nov|December|Dec)[\/ ]\d{2,4})', str(textdate))
for match in matches:
print(match[0])
datadate = match[0]
import pandas as pd
ecbdf = pd.DataFrame({"Article": [Article]; "Title": [title]: "Text": [paragraphs], "date": datadate})
同样回到刮水的问题上,因为第一种用靓汤的方法对我不起作用,我也试着用不同的方法来处理这个问题。该网站有RSS提要,因此我想使用以下代码:
import feedparser
from pandas.io.json import json_normalize
import pandas as pd
import requests
rss_url='https://www.ecb.europa.eu/home/html/rss.en.html'
ecb_feed = feedparser.parse(rss_url)
df_ecb_feed=json_normalize(ecb_feed.entries)
df_ecb_fead.head()
在这里,我遇到了一个问题,一开始甚至找不到RSS提要url。我尝试了以下方法:我查看了源页面,尝试搜索“RSS”,并尝试了通过这种方式可以找到的所有URL,但我总是得到空数据框
我是一个网页抓取的初学者,在这一点上,我不知道如何继续或如何处理这个问题。最后,我想完成的是收集子页面中的所有文章及其标题、日期和作者,并将它们放在一个数据框架中
抓取这个站点的最大问题可能是延迟加载:使用JavaScript,他们从几个html页面加载文章,并将它们合并到列表中。有关详细信息,请查看源代码中的
index_include
。这对于仅使用请求和BeautifulSoup进行刮取是有问题的,因为您的soup实例从请求内容中获得的只是基本框架,而没有文章列表。现在您有两个选择:/press/pr/date/2019/html/index_include.en.html
。这可能是一个更容易的选择,但你必须在你感兴趣的每一年都这样做李>除此之外,我建议使用CSS选择器从HTML代码中提取信息。这样,你只需要写几行文章就可以了。另外,如果你使用
index.en.html
页面进行抓取,我认为你不必过滤英语文章,因为它默认显示英语,如果可用,还显示其他语言下面是一个我快速组合的示例,这当然可以优化,但它展示了如何使用Selenium加载页面并提取文章URL和文章内容:
我在新闻稿页面获得以下输出:
相关问题 更多 >
编程相关推荐