【问题标题】:Issue using BeautifulSoup and reading target URLs from a CSV使用 BeautifulSoup 和从 CSV 读取目标 URL 的问题
【发布时间】:2020-07-01 07:16:19
【问题描述】:

当我使用单个 URL 来抓取 URL 变量时,一切都按预期工作,但在尝试从 csv 读取链接时没有得到任何结果。任何帮助表示赞赏。

关于 CSV 的信息:

  • 一列的标题名为“链接”
  • 300 行没有空格的链接,逗号,;或链接之前/之后的其他章程
  • 每行一个链接
    import requests  # required to make request
    from bs4 import BeautifulSoup  # required to parse html
    import pandas as pd
    import csv
    
    with open("urls.csv") as infile:
        reader = csv.DictReader(infile)
        for link in reader:
            res = requests.get(link['Links'])
            #print(res.url)
    url = res
    
    page = requests.get(url)
    
    soup = BeautifulSoup(page.text, 'html.parser')
    
    email_elm0 = soup.find_all(class_= "app-support-list__item")[0].text.strip()
    email_elm1 = soup.find_all(class_= "app-support-list__item")[1].text.strip()
    email_elm2 = soup.find_all(class_= "app-support-list__item")[2].text.strip()
    email_elm3 = soup.find_all(class_= "app-support-list__item")[3].text.strip()
    
    final_email_elm = (email_elm0,email_elm1,email_elm2,email_elm3)
    
    
    print(final_email_elm)
    
    df = pd.DataFrame(final_email_elm)
    
    #getting an output in csv format for the dataframe we created
    #df.to_csv('draft_part2_scrape.csv')

【问题讨论】:

  • 既然您已经导入了 pandas,请尝试使用 df = pd.read_csv() 读取 csv。这将允许您轻松获得带有df['Links'] 的链接列表。只是迭代。这对你有用吗?
  • @Phineas 谢谢。我可以阅读带有df = pd.read_csv() 的链接,但无法从中创建汤。

标签: python pandas beautifulsoup


【解决方案1】:

问题出在这部分代码:

with open("urls.csv") as infile:
    reader = csv.DictReader(infile)
    for link in reader:
        res = requests.get(link['Links'])
...

循环执行后,res 将拥有最后一个链接。所以,这个程序只会抓取最后一个链接。

要解决此问题,请将所有链接存储在一个列表中,然后迭代该列表以抓取每个链接。您可以将 scraped 结果存储在单独的数据框中,并在最后将它们连接起来以存储在单个文件中:

import requests  # required to make request
from bs4 import BeautifulSoup  # required to parse html
import pandas as pd
import csv

links = []
with open("urls.csv") as infile:
    reader = csv.DictReader(infile)
    for link in reader:
        links.append(link['Links'])
        

dfs = []
for url in links:
    page = requests.get(url)

    soup = BeautifulSoup(page.text, 'html.parser')

    email_elm0 = soup.find_all(class_="app-support-list__item")[0].text.strip()
    email_elm1 = soup.find_all(class_="app-support-list__item")[1].text.strip()
    email_elm2 = soup.find_all(class_="app-support-list__item")[2].text.strip()
    email_elm3 = soup.find_all(class_="app-support-list__item")[3].text.strip()

    final_email_elm = (email_elm0, email_elm1, email_elm2, email_elm3)
    print(final_email_elm)

    dfs.append(pd.DataFrame(final_email_elm))


#getting an output in csv format for the dataframe we created
df = pd.concat(dfs)
df.to_csv('draft_part2_scrape.csv')

【讨论】:

  • line 19, in <module> page = requests.get(url) line 76, in get return request('get', url, params=params, **kwargs) line 61, in request return session.request(method=method, url=url, **kwargs) line 530, in request resp = self.send(prep, **send_kwargs) line 637, in send adapter = self.get_adapter(url=request.url) line 728, in get_adapter raise InvalidSchema("No connection adapters were found for {!r}".format(url)) requests.exceptions.InvalidSchema: No connection adapters were found for 'Links\n0
  • @neohex 这是因为名为 url 的对象不是字符串而是请求对象.... Moosa 的代码发出两个 get 请求,一个在实际 url 上,一个在此请求的结果上。 ..
  • @Phineas 只是将 URL 变量更改为 for 循环中的其他内容吗?我尝试更改它并仍然收到错误。抱歉,如果我要求很多手握。我仍然是初学者,但会尽我所能测试。
  • @neohex 我已经编辑了我的答案并更新了@Phineas 指出的内容。您可以复制该代码。唯一的区别在于第一个 for 循环。 res = requestslinks.getappend(link['Links'])这条语句被删除,第二条语句更新为links.append(link['Links'])
  • 谢谢。获取链接的关键错误。正在尝试调试。 line 10, in <module> links.append(link['Links']) KeyError: 'Links'
猜你喜欢
  • 1970-01-01
  • 2018-06-18
  • 2018-04-15
  • 1970-01-01
  • 2022-01-05
  • 2017-09-17
  • 1970-01-01
  • 2023-03-04
  • 1970-01-01
相关资源
最近更新 更多