将结果导出到excel文件标题和链接请求python

将结果导出到excel文件标题和链接请求python,python,excel,csv,beautifulsoup,python-requests,Python,Excel,Csv,Beautifulsoup,Python Requests,我正在培训如何使用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.entr

我正在培训如何使用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文件


我只需要一个列来显示文章的标题,另一个列来显示每篇文章的链接。

实际上,你只需一个列表就可以做到这一点

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

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

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)]
然后,使用该模块,您可以将此列表传递给创建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格式,最好使用该模块:

import pandas as pd
df = pd.DataFrame(data, columns=['Title', 'URL'])
df.to_excel('output_data.xlsx')
默认情况下,这也将导出行号。如果希望省略它们,可以使用该类,如中所示


编辑:

如果您还想提取日期,那么可以通过单独的列表理解来完成(因为日期信息完全位于不同的HTML元素中)

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

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']]为我在汤中添加文章的日期。选择('h2.entry-title a')]
?@yasserkalil-sure,我已经更新了答案以同时提取日期。@yasserkalil-sure,它将以同样的方式工作,而不是
[I.text,I['href']]
对于所需的任何
额外
字段,它都类似于
[i.text,i['href'],extra]
。每个内部列表成为文件的一行,您可以根据需要添加任意多的列。非常感谢。顺致敬意,