【问题标题】:How to export all the link in a csv or text file?如何导出 csv 或文本文件中的所有链接?
【发布时间】:2021-08-17 01:33:40
【问题描述】:
import urllib.request as req
import re
import bs4
import csv


url="https://en.wikipedia.org/wiki/South_China_Morning_Post"
request=req.Request(url,headers={
    "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36)"})
with req.urlopen(request) as response:
    data=response.read().decode("utf-8")

root=bs4.BeautifulSoup(data,'html.parser')
links_list=root.find_all('a')
print(type(links_list))
for link in links_list:
        if 'href' in link.attrs:
            text=str(link.attrs['href'])
            with open('link.csv','a',newline='',encoding='utf_8_sig') as csvfile:
                    writer = csv.writer(csvfile)
                    writer.writerow(text)
            #print(str(link.attrs['href']))   #for debug


# matchno=root.find_all(class_="nav-link",href=True)
# print(matchno)

当我运行上面的代码时,我在 Excel 文件中得到了以下输出:

/,w,i,k,i,/,S,C,M,P,_,(,d,i,s,a,m,b,i,g,u,a,t,i,o,n,)
/,w,i,k,i,/,F,i,l,e,:,S,C,M,P,_,l,o,g,o,.,s,v,g

我可以知道如何将所有这些链接改正吗?

/wiki/SCMP_(disambiguation)
/wiki/File:SCMP_logo.svg

【问题讨论】:

  • 请提供预期的minimal, reproducible example (MRE)。我们应该能够复制和粘贴您的代码的连续块,执行该文件,并重现您的问题以及跟踪问题点的输出。这让我们可以根据您的测试数据和所需的输出来测试我们的建议。您在这篇文章中包含了很多的开销。您的问题是您永远不应该将原始 URL 字符串分解为单个字符。跟踪您的代码,了解您在哪里执行此操作,然后...停止这样做
  • 看来这是一个完整的MCVE。我可以很容易地重现这个问题。
  • 嗨@Prune,这个帖子似乎是一个MRE。尽管print(str(link.attrs['href'])) 显示正确的输出,但问题/,w,i,k,i,/,F,i,l,e,:,S,C,M,P,_,l,o,g,o,.,s,v,g 在Excel 文件link.csv 中重现。您应该删除您的反对票
  • @BlackRaven:感谢您对我的回访。我目前无法检查自己,但我相信你的证据。我已经删除了我的关闭投票。在进行编辑之前,我无法删除反对票,并且我犯了审查未完成的编辑的错误,而不是进行微不足道的改进以强制它通过。

标签: python api csv beautifulsoup python-requests


【解决方案1】:

您只需将链接写入文件:

with open('link.csv','w', encoding='utf_8_sig') as csvfile:
    for link in links_list:
        if 'href' in link.attrs:
            csvfile.write(f"{link['href']}\n")

writer.writerow(text) 接受 row 参数,该参数是要写入文件的值(列值)列表。由于您传递字符串,它们被解析为单独字符的列表,因此每个字符之间的逗号。

【讨论】:

    【解决方案2】:

    写完每一行后需要用\n移动到下一行

    root=bs4.BeautifulSoup(data,'html.parser')
    links_list=root.find_all('a')
    print(type(links_list))
    for link in links_list:
        if 'href' in link.attrs:
            with open('link.csv','a',newline='',encoding='utf_8_sig') as csvfile:
                csvfile.write(str(link.attrs['href'])+'\n')
    

    输出 Excel link.csv

    【讨论】:

      猜你喜欢
      • 2020-10-04
      • 2020-05-25
      • 2020-12-27
      • 2019-07-01
      • 2017-02-17
      • 2018-03-28
      • 2012-11-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多