为什么此循环仅采用第一个值?

时间:2019-10-30 20:39:20

标签: python python-3.x web-scraping

因此,我试图从下面代码的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)

3 个答案:

答案 0 :(得分:1)

您要遍历所有表,而不要遍历每个表中的所有项目。

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)

答案 1 :(得分:0)

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('tbody').find_all('tr')

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)

key_data2 = key_data.find_all('tbody')

这是导致解决方案出现问题的行。  表格行代表每个项目。因此,您需要找到所有行并对其进行迭代

答案 2 :(得分:0)

基于@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)