【问题标题】:Multiple Page BeautifulSoup Script only Pulling first value多页 BeautifulSoup 脚本仅拉取第一个值
【发布时间】:2020-09-06 06:28:52
【问题描述】:

这里是屏幕抓取的新手,这是我第一次在 stackoverflow 上发帖。提前为这篇文章中的任何格式错误道歉。尝试从具有 URL 的多个页面中提取数据: https://www.landwatch.com/Michigan_land_for_sale/West_Central_Region/Page-' + str(page)

例如,第 1 页是:

https://www.landwatch.com/Michigan_land_for_sale/West_Central_Region/Page-1

第 2 页: https://www.landwatch.com/Michigan_land_for_sale/West_Central_Region/Page-2

等等……

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

14.01 Acres   Vestaburg, Montcalm County, MI$275,000

我的意图是创建一个包含数百行的电子表格,用于从 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) 的行上,并尝试更改行,但在运行时不断出错。

感谢任何帮助。

【问题讨论】:

    标签: python pandas beautifulsoup


    【解决方案1】:

    我相信错误就在这条线上:

    desc = container.getText(strip=True)
    

    每次循环时,desc 中的值都会被替换,而不是添加。要将项目添加到列表中,请执行以下操作:

    desc.append(container.getText(strip=True))
    

    另外,由于它已经是一个列表,您可以像这样从 DataFrame 创建中删除括号:

    df = pd.DataFrame({'description': desc}) 
    

    【讨论】:

    • 这很棒!感谢您的反馈意见。非常感谢!
    • 没问题!如果你不介意,可以选择我的答案作为解决方案吗?
    【解决方案2】:

    原因是循环中没有添加数据,所以只保存了最终数据。出于测试目的,此代码现在位于第 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->all_data.to_csv是修改后的内容。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-27
    相关资源
    最近更新 更多