Python 多页BeautifulSoup脚本仅拉取第一个值
这是我第一次在stackoverflow上发表文章。如果这篇文章中有格式错误,请提前登录。正在尝试使用URL从多个页面提取数据: “+str(第页) 例如,第1页是: 第2页: 等等 我的脚本正在运行,没有错误。但是,my Pandas导出的csv仅包含第一个提取值的一行。在发布时,第一个值为: 密歇根州蒙特卡姆县维斯塔堡14.01英亩,275000美元 我的目的是创建一个包含数百行的电子表格,从URL中提取属性描述 这是我的密码:Python 多页BeautifulSoup脚本仅拉取第一个值,python,pandas,beautifulsoup,Python,Pandas,Beautifulsoup,这是我第一次在stackoverflow上发表文章。如果这篇文章中有格式错误,请提前登录。正在尝试使用URL从多个页面提取数据: “+str(第页) 例如,第1页是: 第2页: 等等 我的脚本正在运行,没有错误。但是,my Pandas导出的csv仅包含第一个提取值的一行。在发布时,第一个值为: 密歇根州蒙特卡姆县维斯塔堡14.01英亩,275000美元 我的目的是创建一个包含数百行的电子表格,从URL中提取属性描述 这是我的密码: import requests from requests
import requests
from requests import get
from bs4 import BeautifulSoup
headers = ({'User-Agent':
'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36'
}
)
n_pages = 0
desc = []
for page in range(1,900):
n_pages += 1
sapo_url = 'https://www.landwatch.com/Michigan_land_for_sale/West_Central_Region/Page-' + str(page)
r=get(sapo_url, headers=headers)
page_html = BeautifulSoup(r.text, 'html.parser')
house_containers = page_html.find_all('div', class_="propName")
if house_containers != []:
for container in house_containers:
desc = container.getText(strip=True)
else:
break
print('you scraped {} pages containing {} Properties'.format(n_pages, len(desc)))
import pandas as pd
df = pd.DataFrame({'description': [desc]})
df.to_csv('test4.csv', encoding = 'utf-8')
我怀疑问题在于读取desc=container.getText(strip=True)的行,并且尝试更改该行,但在运行时不断出错
感谢您的帮助 我认为错误在于:
desc = container.getText(strip=True)
每次循环时,desc
中的值将被替换,而不是添加。要将项目添加到列表中,请执行以下操作:
desc.append(container.getText(strip=True))
此外,由于它已经是一个列表,您可以从数据帧创建中删除括号,如下所示:
df = pd.DataFrame({'description': desc})
我认为错误在于:
desc = container.getText(strip=True)
每次循环时,desc
中的值将被替换,而不是添加。要将项目添加到列表中,请执行以下操作:
desc.append(container.getText(strip=True))
此外,由于它已经是一个列表,您可以从数据帧创建中删除括号,如下所示:
df = pd.DataFrame({'description': desc})
原因是没有在循环中添加数据,因此只保存最终数据。出于测试目的,此代码现在位于第2页,因此请修复它
import requests
from requests import get
from bs4 import BeautifulSoup
import pandas as pd
headers = ({'User-Agent':
'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36'
}
)
n_pages = 0
desc = []
all_data = pd.DataFrame(index=[], columns=['description'])
for page in range(1,3):
n_pages += 1
sapo_url = 'https://www.landwatch.com/Michigan_land_for_sale/West_Central_Region/Page-' + str(page)
r=get(sapo_url, headers=headers)
page_html = BeautifulSoup(r.text, 'html.parser')
house_containers = page_html.find_all('div', class_="propName")
if house_containers != []:
for container in house_containers:
desc = container.getText(strip=True)
df = pd.DataFrame({'description': [desc]})
all_data = pd.concat([all_data, df], ignore_index=True)
else:
break
all_data.to_csv('test4.csv', encoding = 'utf-8')
print('you scraped {} pages containing {} Properties'.format(n_pages, len(desc)))
原因是没有在循环中添加数据,因此只保存最终数据。出于测试目的,此代码现在位于第2页,因此请修复它
import requests
from requests import get
from bs4 import BeautifulSoup
import pandas as pd
headers = ({'User-Agent':
'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36'
}
)
n_pages = 0
desc = []
all_data = pd.DataFrame(index=[], columns=['description'])
for page in range(1,3):
n_pages += 1
sapo_url = 'https://www.landwatch.com/Michigan_land_for_sale/West_Central_Region/Page-' + str(page)
r=get(sapo_url, headers=headers)
page_html = BeautifulSoup(r.text, 'html.parser')
house_containers = page_html.find_all('div', class_="propName")
if house_containers != []:
for container in house_containers:
desc = container.getText(strip=True)
df = pd.DataFrame({'description': [desc]})
all_data = pd.concat([all_data, df], ignore_index=True)
else:
break
all_data.to_csv('test4.csv', encoding = 'utf-8')
print('you scraped {} pages containing {} Properties'.format(n_pages, len(desc)))
这很有效!谢谢你的反馈。非常感谢!没问题!如果你不介意,你能选择我的答案作为解决方案吗?这很有效!谢谢你的反馈。非常感谢!没问题!如果你不介意,你能选择我的答案作为解决方案吗?非常感谢你的回答。使用这段代码,我仍然只能得到一行结果。另一个解决方案效果很好。问题是代码正在替换,而不是在每个循环中附加到数据帧。我检查了您评论中的CSV文件输出,它确实是一行。由于获得了预期结果,
all_data
的代码被修改df.to_csv
->所有数据。to_csv
是修改后的内容。非常感谢您的回复。使用这段代码,我仍然只能得到一行结果。另一个解决方案效果很好。问题是代码正在替换,而不是在每个循环中附加到数据帧。我检查了您评论中的CSV文件输出,它确实是一行。由于获得了预期结果,all_data
的代码被修改df.to_csv
->所有数据。to_csv
是修改后的内容。