Python 为什么这个循环只取第一个值?

Python 为什么这个循环只取第一个值?,python,python-3.x,web-scraping,Python,Python 3.x,Web Scraping,因此,我试图从下面代码中的URL中的“最活跃”部分刮取公司名称和股票价格,并将其全部存储在一个列表中。我曾考虑使用一个循环,这样它就能抓住所有的公司,但出于某种原因,它只能得到第一家公司及其股价。似乎不管我是否让它搜索“tbody”,它都会返回相同的公司和价格,而不是在网页的整个部分循环。任何帮助都将不胜感激 import requests from bs4 import BeautifulSoup stock_list = [] url='https://markets.on.nytimes.

因此,我试图从下面代码中的URL中的“最活跃”部分刮取公司名称和股票价格,并将其全部存储在一个列表中。我曾考虑使用一个循环,这样它就能抓住所有的公司,但出于某种原因,它只能得到第一家公司及其股价。似乎不管我是否让它搜索“tbody”,它都会返回相同的公司和价格,而不是在网页的整个部分循环。任何帮助都将不胜感激

import requests
from bs4 import BeautifulSoup
stock_list = []
url='https://markets.on.nytimes.com/research/markets/overview/overview.asp'

response = requests.get(url)
if not response.status_code == 200:
    print(respose.status_code)

results_page = BeautifulSoup(response.content,'lxml')
key_data=results_page.find('table',class_="stock-spotlight-table",id="summ_vol+")
key_data2=key_data.find_all('tbody')

def pull_active(url):
    for i in key_data2:
        label = i.find('a', class_='truncateMeTo1').get_text()
        value = i.find('td', class_='colPrimary').get_text()
        stock_list.append((label, value))
    print(stock_list)

pull_active(url)

您在所有表上循环,但不是在每个表中的所有项上循环

def pull_active(url):
    for i in key_data2:
        for td in i.findall('td', class_='colText'):
            label = td.find('a', class_='truncateMeTo1')
            value = td.find('td', class_='colPrimary')
            if a and col:
                stock_list.append((label.get_text(), value.get_text()))
    print(stock_list)

key\u data2=key\u data.find\u all('tbody'))

这是导致解决方案出现问题的原因。
表行表示每个项目。因此,你需要找到所有的行,并在其中迭代

根据@Barmar的答案,我也能得到一个稍微不同的解决方案

def pull_active(url):
    for i in key_data2:
        for td in i.find_all('td', class_='colText'):
            label = td.find('a', class_='truncateMeTo1').get_text()
            value = i.find('td', class_='colPrimary').get_text()
        stock_list.append((label, value))
    print(stock_list)

您确定此集合包含多个项目吗?它可能会像广告所宣传的那样工作。@J.Murray使用视图源,您将看到许多匹配项。请确保没有动态内容加载发生在那里。尝试打印
key\u数据
block并手动检查其中的内容。始终将您的结果与view source进行比较。我相信您会-但您是否在Python代码中设置断点并查看该集合中的内容?@J.Murray因此我正在查看该站点,目前在该部分中,它有GE、AMD、PG&E、菲亚特等,以及它们各自的股价。当我运行此代码时,它只返回第一家公司及其价格(在本例中为GE)。如果我运行
print(key_data2)
,我可以看到所有其他公司也列在下面。我需要它来获取其余的公司。所以我刚刚尝试了这个,它现在给了我一个
'NoneType'对象不可调用的
错误。需要添加检查以防找不到项目。这样做会给我一个
'NoneType'对象没有属性“get_text”
错误。不过不用担心,我只需将value变量改为
value=I.find('td',class='colPrimary')
而不是
td.find,就可以解决这个问题。不是100%确定为什么会这样,但不管怎样,谢谢你给我答案!这就是你在原始代码中所做的。但这只会找到表中的第一个。不,我的意思是保留您现在的确切格式,但只将值1更改为
I.find
(标签仍使用
td.find
)。我刚刚运行了编辑后的版本,它给出了我想要的所有值。每个
truncateMeTo1
colPrimary
中都有多个
truncateMeTo1
colPrimary
。@Barmar我也运行了这个版本,它给了我与您相同的答案,它同样有效。不过,我现在很好奇哪一个更有效。
def pull_active(url):
    for i in key_data2:
        for td in i.find_all('td', class_='colText'):
            label = td.find('a', class_='truncateMeTo1').get_text()
            value = i.find('td', class_='colPrimary').get_text()
        stock_list.append((label, value))
    print(stock_list)