你实际上可以用一个列表推导来做到这一点。
基本上,你所拥有的是正确的方法,你只需要使用你的列表理解创建一个列表列表。
对于soup.select 返回的每个匹配项,您可以同时提取text 和href。
然后,使用 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)]