python - 使用 BeautifulSoup 和从 CSV 读取目标 URL 的问题
问题描述
当我使用单个 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')
解决方案
问题在于这部分代码:
with open("urls.csv") as infile:
reader = csv.DictReader(infile)
for link in reader:
res = requests.get(link['Links'])
...
循环执行后,res
会有最后一个链接。所以,这个程序只会抓取最后一个链接。
要解决此问题,请将所有链接存储在一个列表中并迭代该列表以抓取每个链接。您可以将抓取的结果存储在单独的数据框中,并在最后将它们连接起来以存储在单个文件中:
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')
推荐阅读
- java - 有没有办法在 Android Studio 中通过 Ajax 发送多种类型的 HashMap 参数?
- python - 我怎样才能做一个循环?
- azure-devops - devops azure vsts biild下的脚本容器问题
- validation - 我正在尝试在 Vue.js 和 Php 中构建一个联系表单,但是我遇到了错误,我不太确定如何解决这个问题
- vb.net - 如何将鼠标位置转换为位置?
- python - 为什么我的原始二维数组在以下代码中被修改
- python - 如何使用 AWS Cognito 检索正确的凭证以访问 boto3 客户端上的 AWS SecretsManger - 身份池
- python - RPLY 解析器返回 ValueError
- python - 如何在滚动数据的子集上应用滚动聚合函数?
- javascript - 用 Java 下载带有 JavaScript Cookie 的文件