我试图遍历一个网站的几百页并抓取佛教名言,然后将它们保存到一个数据框中。我大部分时间都在运行代码,但是我正在努力正确解析一些文本。在我抓取的每个页面上都有 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
提前致谢!克里斯
答案 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)]
})