【问题标题】:After looping, which is the correct way of returning into a list all the iterated elements?循环后,将所有迭代元素返回到列表中的正确方法是什么?
【发布时间】:2017-04-10 02:02:46
【问题描述】:

我有以下函数,它接受一个.html 文档并提取一些内容:

        for e in soup.tbody.findAll('a', href=True):
            tree = etree.fromstring(str(e))
            for e in tree.xpath('//b'):
                # Here, instead of the above line, I would like to get in a single string all the printed elements in tree.xpath()

如何在一个动作中返回tree.xpath('//a') 中的所有es 列表?我尝试将每个元素和new_lis += element 附加到一个新列表中,但是它不起作用。

【问题讨论】:

  • 您能否展示所需输出与当前输出的示例?
  • 我用信息更新了问题,谢谢@RobertValencia
  • 所以如果你只使用print,它会打印所有的迭代输出,但是如果你将它们附加到列表中,它只会保存第一个迭代输出?
  • 这是正确的@RobertValencia,我该怎么做才能获得所需的输出?。
  • try 语句之前,创建一个字符串s = '',然后将每个新元素添加到s - s += 'www.example.com' + e.get('href')+' | title: ' + e.get('title'),而不是打印。

标签: python python-3.x loops data-structures


【解决方案1】:

有两种方法可以做到这一点:

  1. 只需将所有内容推送到您在任何循环之外创建的列表中(或使用列表推导式):

    def extract(html_file):
        soup = BeautifulSoup(open(html_file), 'lxml')
        results = []
        for e in soup.tbody.findAll('a', href=True):
            results.append(e['href'])
    
        return results
    
    def extract_with_list_comprehension(html_file):
        soup = BeautifulSoup(open(html_file), 'lxml')
        return [e['href'] for e in soup.tbody.findAll('a', href=True)]
    
  2. extract 变成一个生成器,然后在你找到东西时只使用yield,然后迭代结果:

    def extract(html_file):
        for e in BeautifulSoup(open(html_file), 'lxml').findAll('a', href=True):
            yield e['href']
    

    如果需要的话,你可以用list把它变成一个列表:

    all_links = list(extract('~/some/html/file.here'))
    

【讨论】:

  • 我试过extract_with_list_comprehension。但是它给了我[None, None, None, None, None]
  • 抱歉,需要使用['href'] 来获取href 属性,而不是使用.href 来获取元素上不存在的属性。
【解决方案2】:

尝试为每次迭代构建所需的字符串,将字符串附加到列表中,然后返回列表:

def extract(html_file):
    url_list = []
    soup = BeautifulSoup(open(html_file), 'lxml')
    try:
        for e in soup.tbody.findAll('a', href=True):
            tree = etree.fromstring(str(e))
            for e in tree.xpath('//a'):
                url = 'www.example.com' + e.get('href')+' | title: ' + e.get('title'), '\n')
                url_list.append(url)
    except AttributeError:
        print('NaN')

    return url_list

【讨论】:

  • @john doe 这会让你得到想要的结果吗?
  • 不,这返回了第一个元素而不是完整的迭代。
猜你喜欢
  • 1970-01-01
  • 2015-04-03
  • 1970-01-01
  • 2020-12-16
  • 1970-01-01
  • 1970-01-01
  • 2023-03-03
  • 1970-01-01
  • 2020-03-26
相关资源
最近更新 更多