【问题标题】:Python function outputs duplicate valuesPython函数输出重复值
【发布时间】:2014-07-21 18:59:50
【问题描述】:

我定义了一个从网页中抓取数据的函数。在这个网页上有 25 个搜索结果(在我的例子中是属性列表)。我编写了代码来查找所有 25 个这些列表,然后尝试使用 for 循环在网页上的每个列表中调用我的函数。但是,输出显示相同的列表打印了 25 次。我想知道是否可以将我的函数details() 应用于页面上的所有 25 个属性列表:listings = soup.find_all('article',{'role' : 'article'})。然后我需要将这些结果输出到 CSV 文件中。

我使用的是 Python 2.7

这是我目前所拥有的:

output = []
property = []

def address():
    for address in soup.find('span', {'itemprop' : 'address'}):
        property.append(address.text)
def sqft():
    for sqft in soup.find('dl',{'class' : 'property-info-sheet pier-5'}):
        property.append(sqft.text)
def lot():
    for lot in soup.find('dl',{'class' : 'property-info-sheet pier-6'}):
        property.append(lot.text)
def built():
    for built in soup.find('dl',{'class' : 'property-info-sheet pier-7'}):
        property.append(built.text)

def details():
    address()
    sqft()
    lot()
    built()

    file = 'output.csv'
    with open(file,'wb') as f:
       writer = csv.writer(f)   
       writer.writerow(property)

listings = soup.find_all('article',{'role' : 'article'})

for listing in listings:
    details()    

这会输出相同的列表 25 次。是否有可能获得一个列表一次而不是一个列表 25 次?

【问题讨论】:

    标签: python csv for-loop beautifulsoup function


    【解决方案1】:

    你的soup.find_all 和soup.find 调用是不相关的,所以现在循环列表没有意义。您需要在列表中发送详细信息,如下所示:

    for listing in listings:
        details(listing)
    

    具体参考listing而不是soup

    def address(soup):
       ...
    def sqft(soup):
       ...
    def lot(soup):
       ...
    def built(soup):
       ...
    def details(soup):
       address(soup)
       sqft(soup)
       lot(soup)
       built(soup)
    

    【讨论】:

    • 我没有关注这个。如果我将列表发送到详细信息details(listing) 循环以错误结束:'Nonetype' 对象不可迭代。
    • 现在您可以使用 BeautifulSoup 进行解析。返回值有多种类型,可能包括 None。 Find here 旨在返回单个值,但您正在迭代它。这对于某些类型是可能的,但对于其他类型则不是。我建议摆脱 for 循环或切换到 find_all。
    猜你喜欢
    • 1970-01-01
    • 2015-03-23
    • 2021-11-07
    • 2022-11-06
    • 2011-03-04
    • 2013-12-15
    • 2016-05-06
    • 1970-01-01
    相关资源
    最近更新 更多