Python 多页BeautifulSoup脚本仅拉取第一个值

Python 多页BeautifulSoup脚本仅拉取第一个值,python,pandas,beautifulsoup,Python,Pandas,Beautifulsoup,这是我第一次在stackoverflow上发表文章。如果这篇文章中有格式错误,请提前登录。正在尝试使用URL从多个页面提取数据: “+str(第页) 例如,第1页是: 第2页: 等等 我的脚本正在运行,没有错误。但是,my Pandas导出的csv仅包含第一个提取值的一行。在发布时,第一个值为: 密歇根州蒙特卡姆县维斯塔堡14.01英亩,275000美元 我的目的是创建一个包含数百行的电子表格,从URL中提取属性描述 这是我的密码: import requests from requests

这是我第一次在stackoverflow上发表文章。如果这篇文章中有格式错误,请提前登录。正在尝试使用URL从多个页面提取数据: “+str(第页)

例如,第1页是:

第2页:

等等

我的脚本正在运行,没有错误。但是,my Pandas导出的csv仅包含第一个提取值的一行。在发布时,第一个值为:

密歇根州蒙特卡姆县维斯塔堡14.01英亩,275000美元

我的目的是创建一个包含数百行的电子表格,从URL中提取属性描述

这是我的密码:

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
是修改后的内容。