将文本拆分成单独的行 - BeautifulSoup

时间:2021-02-06 12:08:05

标签: python pandas dataframe beautifulsoup

我试图遍历一个网站的几百页并抓取佛教名言,然后将它们保存到一个数据框中。我大部分时间都在运行代码,但是我正在努力正确解析一些文本。在我抓取的每个页面上都有 5 个引号,并且从我在 HTML 输出中可以看出的每个引号都没有明显的标识符。所以我试图遍历我从每个页面上抓取的内容,但它要么覆盖了所有以前的引号(即引号 1-4),要么只是将它们组合到一个单元格中。

请参阅下面的设置和代码:

# For data handling:
import pandas as pd

# Set Pandas output options
pd.set_option('display.max_colwidth', None)

# For the scrape:
from bs4 import BeautifulSoup as BShtml
import urllib.request as ur

# Make empty dataframe
emptydata = pd.DataFrame({"quote":[], "quote_date":[], "page_no":[]})

# Populate dataframe with quotes for first three pages
for i in range(1, 4):
    url = "https://www.sgi-usa.org/tag/to-my-friends/page/" + str(i)
    r = ur.urlopen(url).read()
    soup = BShtml(r, "html.parser")
    new_result = pd.DataFrame({
        "quote":[soup.find_all("div", class_="post-content")],
        "quote_date":[soup.find_all("div", class_="post-date")],
        "page_no": [str(i)]
    })
    emptydata = emptydata.append(new_result)
emptydata

正如您从所附图片中看到的,这将每 5 个引号捆绑到一个单元格中,并为每个页面创建一个新的数据行。关于如何将这些拆分以便每个报价和日期都有一行的任何想法?我尝试遍历 soup.find_all("div", class_="post-content"),但我想我一定是错误地构建了数据框,因为它覆盖了每页上除最后一个引号之外的所有内容。

what my dataframe currently looks like

提前致谢!克里斯

1 个答案:

答案 0 :(得分:1)

如何解决?

您应该添加一个额外的 for 循环来实现您的目标:

Library/Application Support

示例

for post in soup.find_all("div", class_="quote-inner"):
    new_result = pd.DataFrame({
                "quote":[post.find("div", class_="post-content").get_text(strip=True)],
                "quote_date":[post.find_all("div", class_="post-date")[1].get_text()],
                "page_no": [str(i)]
            })