【问题标题】:Export results to excel file title and link requests python [closed]将结果导出到excel文件标题和链接请求python [关闭]
【发布时间】:2021-05-17 07:07:29
【问题描述】:

我正在训练如何在 python 中抓取一些数据,这是我的尝试:

import requests
from bs4 import BeautifulSoup

url = 'https://learndataanalysis.org/python-tutorial/page/10'
r = requests.get(url)
soup = BeautifulSoup(r.content, 'lxml')
links = [i['href'] for i in soup.select('h2.entry-title a')]
print(links)

代码获取网页的链接。 我可以使用这一行来获取每个教程的标题:

[i.text for i in soup.select('h2.entry-title a')]

如何列出链接和标题,最后将结果导出到 excel 文件?

我只需要一列用于文章标题,另一列用于每篇文章的链接。

【问题讨论】:

  • @QHarr 你能看看吗?

标签: python excel csv beautifulsoup python-requests


【解决方案1】:

你实际上可以用一个列表推导来做到这一点。

基本上,你所拥有的是正确的方法,你只需要使用你的列表理解创建一个列表列表。

对于soup.select 返回的每个匹配项,您可以同时提取texthref

然后,使用 csv 模块,您可以将此列表列表传递给 csv.writerows 以创建 CSV 文件,以便在 Excel 或其他工具中查看、数据处理等。

如果需要,您还可以选择在列表列表中添加标题,例如['Title', 'URL'].

这是一个完整的工作示例:

from bs4 import BeautifulSoup

import csv
import requests

url = 'https://learndataanalysis.org/python-tutorial/page/10'
r = requests.get(url)
soup = BeautifulSoup(r.content, 'lxml')

data = [[i.text, i['href']] for i in soup.select('h2.entry-title a')]

# optional, if you want to add a header line
data.insert(0, ['Title', 'URL'])

with open('output_data.csv', 'w') as output_file:
    writer = csv.writer(output_file, delimiter=',', quoting=csv.QUOTE_ALL)
    writer.writerows(data)

请注意,csv.QUOTE_ALL 并非绝对必要,但在所有字段上强制引用通常是个好主意。


如果您想导出为 XLSX 格式,最好改用 pandas 模块:

import pandas as pd
df = pd.DataFrame(data, columns=['Title', 'URL'])
df.to_excel('output_data.xlsx')

默认情况下,这也会导出行号。如果您想省略它们,可以使用pandas.ExcelWriter 类,如this post


编辑:

如果您还想提取日期,则可以使用单独的列表推导来执行此操作(因为日期信息完全位于不同的 HTML 元素中)。

然后,您可以使用zip 将信息组合在一起。

data = [[i.text, i['href']] for i in soup.select('h2.entry-title a')]
dates = [i.text for i in soup.select('span.published')]
data = [i + [j] for i, j in zip(data, dates)]

【讨论】:

  • 太棒了。非常感谢。我会仔细研究代码,以便学习我不知道的新技能。
  • 是否可以使用理解来添加第三项。我的意思是如果我需要通过编辑data = [[i.text, i['href']] for i in soup.select('h2.entry-title a')]这一行来添加文章的日期怎么办?
  • @yasserkhalil 当然,我已经更新了答案以提取日期。
  • @yasserkhalil 当然,它会以相同的方式工作,而不是[i.text, i['href']],对于您想要的任何extra 字段,它将类似于[i.text, i['href'], extra]。每个内部列表都成为文件的一行,您可以根据需要添加任意数量的列。
  • 非常感谢。最好的问候
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-28
相关资源
最近更新 更多