【问题标题】:I need to save scraped urls to a csv file in URI format. file won't write to csv我需要将抓取的 url 以 URI 格式保存到 csv 文件中。文件不会写入 csv
【发布时间】:2021-02-06 01:23:53
【问题描述】:

我是一个认真的新手。我有一个项目,遇到了麻烦。我要创建一个程序来:

1.) 从网站上抓取网页链接, 2.) 删除重复项, 3.) 确保所有网页链接都是 URI 格式,并且 4.) 写入 csv。

我在第 3 步遇到了麻烦。我在下面分享的第一段代码是我无数次失败的尝试之一。问题似乎在于我无法将我的集合转换回列表并且集合不是可变的,或者......我认为我在 Jupyter 中所做的一些事情导致它失去了与程序的连接并且它无法识别我引用我抓取的链接的方式。请告诉我我在哪里搞砸了。

尝试失败:

    save link as BeautifulSoup object
    soup= BeautifulSoup
    r= urllib.request.urlopen('https://www.census.gov/programs-surveys/popest.html').read()
    soup = BeautifulSoup(r,"html.parser") 
    links=set([a['href'] for a in soup.find_all('a',href=True)])  
    print(set) 
    print(links) 

    f=open('JessicasExport.csv','w', newline='') 
    writer=csv.writer(f,delimiter=',', lineterminator= '\r')
    set=MyList
    MyList=[set]
    ctr=0
    for x in MyList:
        MyList.update([x])
        if not MyList:
       ''
       elif hrefs.startswith(['#']):
            MyList.add(hrefs[1:])
       elif hrefs.startswith(['/']):
            MyList.add (['https://www.census.gov'+ hrefs])
       elif hrefs.endswith(['.gov']):
            MyList.add ([hrefs + '/'])
       else:
           MyList.add([hrefs])
    
           writer.writerow([MyList])
           del MyList[:]
           ctr += 1


     print('Number of urls written to CSV:' , ctr)
     f.close()

输出 []:#RESULTING 错误

     AttributeError                            Traceback (most recent call last)
    <ipython-input-5-35e0479f6c2e> in <module>
     5 ctr=0
     6 for x in MyList:

----> 7 MyList.update([x]) 8 如果不是 MyList: 9''

   AttributeError: 'list' object has no attribute 'update'

然后我对其进行了调整并尝试了这个。下面的这段代码成功地吐出了我抓取的链接,但没有向 csv 写入任何内容,也没有更正不在 URI 中的部分代码。但是.....它没有产生错误代码,所以我很困惑......非常感谢任何帮助!几天前,我一直在等待老师的回复,并渴望取得进展。

部分成功尝试,没有错误但没有文件并且没有附加到 uri

     import csv
     import requests
    from bs4 import BeautifulSoup
    import urllib.request
    import os



    soup= BeautifulSoup
    r= urllib.request.urlopen('https://www.census.gov/programs-surveys/popest.html').read()
    soup = BeautifulSoup(r,"html.parser") 
    links=set([a['href'] for a in soup.find_all('a',href=True)]) 
    print(set) 
    print(links) 


    f=open('check.csv', 'w', newline='')
    writer = csv.writer(f, delimiter=',', lineterminator='\r')
    Myset = set()
    MyList= [Myset]
    ctr=0    
    for x in Myset:
        MyList.append ([x])
        if not MyList:
           ''
        elif hrefs.startswith(['#']):
            MyList.add(hrefs[1:])
        elif hrefs.startswith(['/']):
            MyList.add (['https://www.census.gov'+ hrefs])
        elif hrefs.endswith(['.gov']):
            MyList.add ([hrefs + '/'])
        else:
            MyList.add([hrefs])
    
            writer.writerow([MyList])
            del MyList[:]
            ctr += 1

            f.close()

感谢所有审阅并提出建议的人!我真的很想明白。

【问题讨论】:

  • 你到底想用Myset = set()做什么?您基本上已将 Myset 声明为一个新的(因此是空的)集合,然后尝试迭代它。由于Myset 中没有任何内容,因此您的 for 循环基本上什么都不做。您的链接存储在变量links
  • 非常感谢您抽出宝贵时间审阅并向我提供反馈!这很有意义。我尝试了 myset=(links) 但出现名称错误。好像它无法识别链接。感谢您花时间指出我的错误!我参加了一个为期 6 周的课程,只是作为介绍,没有背景,我显然需要从更基本的东西开始。
  • 你在哪里有NameError?因为它应该已经工作了myset = links(你放的那些括号什么都不做),因为links已经被定义了。但是,您为什么要将变量 myset 分配给 link 而不做任何更改?

标签: python csv web-scraping beautifulsoup


【解决方案1】:

@Mercury 是对的,你定义了一个集合(用大写 M,你不应该这样做,因为你应该遵循PEP-8 的约定)然后将它放入一个空列表(也用大写 M) : 你想达到什么目的?另外,当您在第一个 if 下方写下那个空字符串时,我想您想了解pass statement

你可能需要pip install lxml 来处理这个(lxml 是一个用于解析的python 库)。


import requests
from bs4 import BeautifulSoup
import os

def update_url(url):
    return # return updated url

req = requests.get('https://www.census.gov/programs-surveys/popest.html')
assert req.status_code == 200, f"Request returned with status {req.status_code}"

soup = BeautifulSoup(req.content, "lxml") 
links = set([a['href'] for a in soup.find_all('a',href = True)])

l = list():
with open('file_name.csv', 'w', newline='') as file:
    writer = csv.writer(file, delimiter=',', lineterminator='\r')
    for url in links:
        new_url = update_url(url) # treat them as you wish
        writer.writerow(new_url) # write url to csv
# with statement closes file automatically

【讨论】:

  • 我希望它通过我的列表并替换不是 URI 格式的 url 段。每次我说 elif href 在 for 循环中。从我得到一个 NameError 开始,说 hrefs 没有定义。我已经搜遍了,谁能帮我理解为什么?
  • 也许hrefs 没有定义,但href 是,如果你在谈论soup.find_all 中的参数。您收到错误是因为该函数无法识别您传递的参数。
  • 我更正了,我得到 NameError name 'href' is not defined。有什么建议?我正在努力解决如何在我的 for 循环上方定义 href 以便它识别 href 是 'a' 的属性而不重新定义 href .....
  • 我不明白为什么它不记得在上面的代码中定义的for循环中的href是什么。是不是因为一旦程序循环通过该代码块,它就不会与下面的 for 循环相关联?
  • 代码总是从头到尾阅读,记住它已经通过的所有内容。除此之外,您的代码(至少您发布的代码)没有定义href,它只是将其作为参数传递给soup.find_all。此外(我想现在我理解了你的问题),我认为你在调用hrefs 时实际上想要使用变量x,这是你在for loop 中使用的循环变量。最后一件事,Myset 是一个空集:它没有任何你想要的 hrefs:拥有它们的对象是 links,它是一个列表。
猜你喜欢
  • 1970-01-01
  • 2019-07-20
  • 2018-09-30
  • 2017-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-02
  • 2020-10-11
相关资源
最近更新 更多