当前位置: 首页 > 知识库问答 >
问题:

美丽的汤获得多页文本

彭鸿哲
2023-03-14

我试图抓取德国聚会的新闻页面,并将所有信息存储在数据框中(“蟒蛇初学者”)。当我想将整个文本甚至日期存储到数据框中时,只存在一个小问题。似乎只有文本的最后一个元素(p... /p)将被存储在行中。我认为问题的出现是因为循环上的迭代是误导的。

import pandas as pd
import requests 
from time import sleep
from random import randint
from time import time
import numpy as np
from urllib.request import urlopen

data = pd.DataFrame()
teaser = ()
title = []
content = ()
childrenUrls = []
mainPage = "https://www.fdp.de"
start_time = time()
counter = 0

#for i in list(map(lambda x: x+1, range(3))):
for i in range(3):

    counter = counter + 1
    sleep(randint(1,3))
    elapsed_time = time() - start_time
    print('Request: {}; Frequency: {} requests/s'.format(counter, counter/elapsed_time))
    url = "https://www.fdp.de/seite/aktuelles?page="+str(i)
    #print(url)
    r = requests.get(url)
    soup = BeautifulSoup(r.content, 'html.parser')

    uls = soup.find_all('div', {'class': 'field-title'})

    for ul in uls:
        for li in ul.find_all('h2'):
            for link in li.find_all('a'):
                url = link.get('href')
                contents = link.text
                print(contents)
                childrenUrls = mainPage+url
                print(childrenUrls)

                childrenPages = urllib2.urlopen(childrenUrls)
                soupCP = BeautifulSoup(childrenPages, 'html.parser')

                #content1 = soupCP.findAll('p').get_text()
                #print(content1)

                for content in soupCP.findAll('p'):
                    #for message in content.get('p'):
                    content = content.text.strip()
                    print(content)

                for teaser in soupCP.find_all('div', class_ = 'field-teaser'):
                    teaser = teaser.text.strip()
                    print(date)

                for title in soupCP.find_all('title'):
                    title = title.text.strip()
                    print(ttt)

                df = pd.DataFrame(
                    {'teaser': teaser,
                     'title' : title,
                    'content' : content}, index=[counter])

                data = pd.concat([data, df])
    #join(str(v) for v in value_list)

共有1个答案

米夕
2023-03-14

必须将每个循环中的文本保存在列表中,而不是保存在简单的字符串变量中。在每次迭代中,代码都会重新定义变量上的值;这会导致丢失以前的数据。

一个很好的方法是在这里使用列表理解。用以下内容替换代码循环的最后3个

content = [x.text.strip() for x in soupCP.find_all('p')]
teaser = [x.text.strip() for x in soupCP.find_all('div', class_='field-teaser')]
title = [x.text.strip() for x in soupCP.find_all('title')]

df = pd.DataFrame(
    {'teaser': teaser,
     'title': title,
     'content': content}, index=[counter])

data = pd.concat([data, df])

列表理解的简单解释:

soupCP.find_all('p')中x的行content=[x.text.strip()相当于:

content = []
for x in soupCP.find_all('p'):
    content.append(x.text.strip())

 类似资料:
  • 我已经成功地编写了从第一页抓取数据的代码,现在我不得不在这段代码中编写一个循环来抓取下一个“n”页。下面是代码 如果有人能指导/帮助我编写代码,从剩余页面中提取数据,我将不胜感激。 谢谢

  • 我试图抓取这个网站:https://www.senate.gov/general/contact_information/senators_cfm.cfm 我的代码: 问题是它实际上并没有到达网站。我在soup var中得到的HTML根本不是正确网页中的HTML。 我不知道从这里去哪里!任何和所有的帮助都将不胜感激。

  • 问题内容: 我有一个像 我可以得到标题标签 但是我怎样才能在b标签之后得到文本呢?我想通过引用该元素而不是body元素来获取包含“ Title:”的元素之后的文本。 问题答案: 参考的文档,你可能想使用你的: 在这种情况下,“同级”是下一个节点,而不是下一个元素/标签。元素的下一个节点是文本节点,因此您可以获得所需的文本。

  • 问题内容: 我正在尝试从Google搜索结果中提取链接。检查元素告诉我,我感兴趣的部分具有“ class = r”。第一个结果如下所示: 要提取“ href”,我要做: 但是我意外地得到: 我想要的地方: 属性“ ping”似乎使它感到困惑。有任何想法吗? 问题答案: 发生了什么? 如果您打印响应内容(即),则会看到您得到的HTML完全不同。页面源和响应内容不匹配。 因为内容是动态加载的,所以 不

  • 问题内容: 我正在尝试解析一个网站,并通过BeautifulSoup.findAll获取一些信息,但它并没有全部找到。.我正在使用python3 代码是这个 它只打印其中一半… 问题答案: 不同的HTML解析器对损坏的HTML的处理方式不同。该页面提供了损坏的HTML,解析器对此的处理不佳: 标准库在此特定页面上的麻烦较少: 使用将其转换为您的特定代码示例,您将这样指定解析器:

  • 问题内容: 我正在尝试在以下html代码中检索一些标签。这只是一部分 您可以在这里找到该网页 我的Python代码如下 但是text变量为空,如果我打印div变量,除了标签外,我上面的HTML完全一样。 问题答案: BeautifulSoup可以使用不同的解析器来处理HTML输入。此处的HTML输入有些破损,并且默认的解析器不能很好地处理它。 改用解析器: